2016-09-09 46 views
1

我已經使用'$ lookup'在一個字段上加入了兩個集合,而實際上我需要兩個字段進行唯一匹配。我的下一步是展開包含我需要的第二個字段的不同值的數組進行唯一匹配,然後將它們與第二個字段的值進行比較,以匹配更高的值。但是,下面代碼段中的第二行不會返回任何結果。MongoDB選擇其中field1等於nested.field2在彙總管道中的文檔

// Request only the page that has been viewed 
{ '$unwind' : '$DSpub.PublicationPages'}, 
{ '$match' : {'pageId' : '$DSpub.PublicationPages.PublicationPageId' } } 

有沒有更適合的方法來做到這一點?或者,我可以通過在執行'$ lookup'之前展開「from」集合來完全避免這樣做,然後匹配這兩個字段?

回答

0

這看起來不那麼容易。

$match不對動態數據進行操作(這意味着我們正在比較靜態值與數據集)。

有輸入收集這樣的: - 要克服,我們可以用$項目階段添加一個布爾靜態標誌,可通過$match

請參見下面的示例中使用

[{ 
     "_id" : ObjectId("56be1b51a0f4c8591f37f62b"), 
     "name" : "Alice", 
     "sub_users" : [{ 
       "_id" : ObjectId("56be1b51a0f4c8591f37f62a") 
      } 
     ] 
    }, { 
     "_id" : ObjectId("56be1b51a0f4c8591f37f62a"), 
     "name" : "Bob", 
     "sub_users" : [{ 
       "_id" : ObjectId("56be1b51a0f4c8591f37f62a") 
      } 
     ] 
    } 
] 

我們只想得到_id$docs.sub_users._id"相同的字段,其中docs$lookup的輸出。

db.collecction.aggregate([{ 
      $lookup : { 
       from : "collecction", 
       localField : "_id", 
       foreignField : "_id", 
       as : "docs" 
      } 
     }, { 
      $unwind : "$docs" 
     }, { 
      $unwind : "$docs.sub_users" 
     }, { 
      $project : { 
       _id : 0, 
       fields : "$$ROOT", 
       matched : { 
        $eq : ["$_id", "$docs.sub_users._id"] 
       } 
      } 
     }, { 
      $match : { 
       matched : true 
      } 
     } 
    ]) 

,讓輸出:

{ 
    "fields" : { 
     "_id" : ObjectId("56be1b51a0f4c8591f37f62a"), 
     "name" : "Bob", 
     "sub_users" : [ 
      { 
       "_id" : ObjectId("56be1b51a0f4c8591f37f62a") 
      } 
     ], 
     "docs" : { 
      "_id" : ObjectId("56be1b51a0f4c8591f37f62a"), 
      "name" : "Bob", 
      "sub_users" : { 
       "_id" : ObjectId("56be1b51a0f4c8591f37f62a") 
      } 
     } 
    }, 
    "matched" : true 
} 
+0

這是一個我很榮幸。 – profesor79

相關問題