【问题标题】:How to match a field value from the same document in mongo?如何匹配mongo中同一文档的字段值?
【发布时间】:2018-03-09 22:40:19
【问题描述】:

我有以下文件:

{
    "_id" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab",
    "field1" : {
        "c1" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab",
        "c2" : "pl_PowerList_bfc523adc09d4be899c264a709cf95ab",
    },
    "Columns" : [ 
        {
            "name" : "abc49777",
            "lookup":{
                "id":"bfc523ad-c09d-4be8-99c2-64a709cf95ab"
            }

        }, 
        {
            "name" : "abc7846",
            "lookup":{
                "id":"cgc523ad-c09d-4be8-99c2-64a709cf95xy"
            }

        }
    ]
}

现在我想获取 field1.c1 值等于 Columns.lookup.id 的所有文档(在任何一个列中)。我尝试了以下查询:

db.mycollection.find({$where:"this.field1.c1 == this.Columns.lookup.id"})

当我执行上述查询时,我收到错误消息,指出字段 id 未定义。我想要所有此类文档,其中至少一列的lookup.id 与该文档的field1.c1 相同。我将如何做到这一点?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你可以试试这个:

    db.mycollection.find( 
    { $where: 
        function() {
            var array = this.Columns;
            for (var i in array) {
                if(array[i].lookup.id == this.field1.c1) {
                    return true;
                }
            }
            return false;
        }
    })
    

    【讨论】:

      【解决方案2】:

      使用聚合框架,您可以在其中利用 $redact 管道运算符。这使您可以递归地遍历文档结构并根据对每个级别的指定条件的评估执行一些操作。

      与使用 $where 运算符相比,使用聚合框架的性能大大提高。

      这个概念可能有点难以理解,但基本上该运算符允许您使用 $cond 运算符处理逻辑条件并使用特殊运算 $$KEEP“保留”逻辑条件为真的文档或$$PRUNE“删除”条件为假的文档。

      此操作类似于具有 $project 管道,该管道选择集合中的字段并创建一个新字段来保存逻辑条件查询的结果,然后是后续 @ 987654327@,除了 $redact 使用单个管道阶段,根据查看数据所需的访问权限限制结果集的内容,效率更高。


      要对field1.c1 值等于Columns.lookup.id(在任一列中)的所有文档运行查询,请包括一个 $redact 阶段,如下所示: p>

      db.mycollection.aggregate([
          {
              "$redact": {
                  "$cond": [
                      {
                          "$setIsSubset": [
                              ["$field1.c1"],
                              {
                                  "$map": {
                                      "input": "$Columns",
                                      "as": "col",
                                      "in": "$$col.lookup.id"
                                  }
                              }
                          ]
                      },
                      "$$KEEP",
                      "$$PRUNE"
                  ]
              }
          }
      ])
      

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        相关资源
        最近更新 更多