2017-09-28 56 views
1

我有以下文件:如何匹配mongo中同一文档的字段值?

{ 
    "_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相同。我将如何做到这一点?

回答

0

你可以试试这个:

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; 
    } 
}) 
+0

超级。有效。 –

0

使用聚合框架,您可以采取的$redact管道运营商的优势。这允许您通过文档结构递归下降,并根据对每个级别指定条件的评估来执行一些操作。

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

概念可以是一个有点棘手把握,但基本上是运营商允许你用$cond操作proccess逻辑条件和使用专项行动$$KEEP“保持”的文件,其中的逻辑条件为真或$$PRUNE以“删除”条件为假的文档。

此操作类似于具有$project管线选择所述集合中的字段,并创建保持从逻辑条件查询,然后随后的$match结果的新的领域,不同之处在于$redact用途一个流水线阶段,它根据查看数据所需的访问来限制结果集的内容,并且效率更高。


为了运行上的所有文件的查询,其中field1.c1值等于Columns.lookup.id(在柱的侧向承载力的任何一个),包括$redact阶段如以下:

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