2016-10-19 43 views
0

所以我有收藏projects其中有場contacts.envCon.$id

 { 
     "contacts" : { 
      ... 
      "envCon" : { 
       "$ref" : "contacts", 
       "$id" : ObjectId("5807966090c01f4174cb1714") <---- NOTICE!!! 
      } 
      ... 
     } 
    } 

contacts集合對象ID爲Example12345看起來是這樣的:

{ 
    "_id" : ObjectId("5807966090c01f4174cb1714"), 
    "name" : "Terracon" 
} 

所以我試着從聚合框架中進行以下$查找:

db.getCollection('projects').aggregate([ 
    { 
      $lookup:{ 
        from: "contacts", 
        localField: "contacts.envCon.id", 
        foreignField: "id", 
        as: "example" 
      } 
    } 
]); 

但它沒有加入我缺少什麼?如何使用來自項目的contacts.envCon.id和來自聯繫人的_id在2個收藏集之間進行查找。

我正在使用流星以防萬一。

回答

0

我不確定你的ObjectId值是怎麼回事;我甚至無法插入ObjectId的字段值(「Example12345」)。這兩個集合之間ObjectID值的差異很可能導致$ lookup失敗。

當我讓MongoDB在「contacts」中生成_id ObjectID值並將相同的值存儲在「projects」集合中時,您提供的聚合查詢適用於我的環境。

$ db.projects.find().pretty() 
{ 
    "_id" : ObjectId("580832011b3c40dba2ae6e32"), 
    "contacts" : { 
     "envCon" : DBRef("contacts", ObjectId("580831d61b3c40dba2ae6e31")) 
    } 
} 

$ db.contacts.find().pretty() 
{ "_id" : ObjectId("580831d61b3c40dba2ae6e31"), "name" : "Terracon" } 


$ db.getCollection("projects").aggregate([ { "$lookup" : {  "from" : "contacts",  "localField" : "contacts.envCon.id",  "foreignField" : "id",  "as" : "example" } } ]).pretty() 
{ 
    "_id" : ObjectId("580832011b3c40dba2ae6e32"), 
    "contacts" : { 
     "envCon" : DBRef("contacts", ObjectId("580831d61b3c40dba2ae6e31")) 
    }, 
    "example" : [ 
     { 
      "_id" : ObjectId("580831d61b3c40dba2ae6e31"), 
      "name" : "Terracon" 
     } 
    ] 
} 
+0

他的對象_ids是mongodb原生_ids,而不是流星生成的。 –

+0

id只是例子我不想複製所有的lond id,只是一個例子,使它更具可讀性,我將它編輯爲包含在兩個真正的id中。 – commonSenseCode

+0

我更新了我的回覆以顯示聚合工作。這個例子中聚合如何在你的環境中表現出來? –