2017-09-28 51 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" 
      ] 
     } 
    } 
]) 
相關問題