2017-04-04 161 views
0

我有一個2個集合。MongoDB - 2個集合中的聚集

第一個集合: 'firmaListesi'

{ 
    "_id" : ObjectId("58455d2d506c1cab1c82153c"), 
    "value" : { 
     "firmaid0" : ObjectId("58455d92506c1cab1c82153e"), 
     "firmaid1" : ObjectId("5847afe2506c912e6e3a72a7"), 
     "firmaid2" : ObjectId("5850f2e725108a44a813f93f"), 
     "firmaid3" : ObjectId("58523f272510fae3c1345547") 
    } 
} 
{ 
    "_id" : ObjectId("58455d2d506c1cab1c82154c"), 
    "value" : { 
     "firmaid0" : ObjectId("5850f2e725108a44a813f93f"), 
     "firmaid1" : ObjectId("58523f272510fae3c1345547") 
    } 
} 

收藏的第二個: 'calisanSayisi'

{ 
    "_id" : ObjectId("58455d92506c1cab1c82153e"), 
    "value" : 13.0 
} 
{ 
    "_id" : ObjectId("5850f2e725108a44a813f93f"), 
    "value" : 1.0 
} 
{ 
    "_id" : ObjectId("58523f272510fae3c1345547"), 
    "value" : 3.0 
} 

我想在與「calisanSayisi關係。 _id'和'firmaListesi.value.firmaid'。我想以這種方式合併兩個收藏。我寫的代碼有錯誤。但是對於一個區域來說這是有效你可以在照片中看到我想要的更好。我想爲所有的領域製作一張照片。

我的結果

{ 
    "_id" : ObjectId("58455d2d506c1cab1c82153c"), 
    "value" : { 
     "firmaid0" : ObjectId("58455d92506c1cab1c82153e"), 
     "firmaid1" : ObjectId("5847afe2506c912e6e3a72a7"), 
     "firmaid2" : ObjectId("5850f2e725108a44a813f93f"), 
     "firmaid3" : { 
      "_id" : ObjectId("58523f272510fae3c1345547"), 
      "value" : 3.0 
     } 
    } 
} 
{ 
    "_id" : ObjectId("58455d2d506c1cab1c82154c"), 
    "value" : { 
     "firmaid0" : ObjectId("5850f2e725108a44a813f93f"), 
     "firmaid1" : ObjectId("58523f272510fae3c1345547") 
    } 
} 

我的代碼:

function birlestir(a,b) { 
    db.firmaListesi.aggregate([ 
     {$lookup: { 
      from: "calisanSayisi", 
      localField: a, 
      foreignField: "_id", 
      as: a 
     }}, 
     {$unwind: {path: b, preserveNullAndEmptyArrays: true}}, 
     {$out: "firmalarId"} 
    ]); 
} 
for(var i=0; i < (Object.keys(db.firmalistesi.value).length); i++){ 
    var a = 'value.firmaid'+i; 
    var b = '$'+a; 
    birlestir(a,b); 
} 

有代碼的主要故障。但我找不到解決方案。你能幫忙嗎?

編輯

'firmaListesi' 陣列

{ 
    "_id" : ObjectId("58455d2d506c1cab1c82153c"), 
    "value" : [ 
     ObjectId("58455d92506c1cab1c82153e"), 
     ObjectId("5847afe2506c912e6e3a72a7"), 
     ObjectId("5850f2e725108a44a813f93f"), 
     ObjectId("58523f272510fae3c1345547") 
    ] 
} 
{ 
    "_id" : ObjectId("58455d2d506c1cab1c82154c"), 
    "value" : [ 
     ObjectId("5850f2e725108a44a813f93f"), 
     ObjectId("58523f272510fae3c1345547") 
    ] 
} 
+0

我很想知道在firmaListesi集合中的'value'字段是一個對象而不是數組後面的決定。 –

+0

可以說,在搜索解決方案時嘗試一切。 :)如果有解決方案作爲數組,我可以將其轉換回數組。 – forguta

回答

1

您可以使用下面聚集管道。以下查詢將$unwind(該步驟不需要3.4版本)ObjectID'svalue字段firmaListesi集合後跟$look將集合中的這些ObjectId集合到b數組中。

下一步是$unwindb輸出陣列和隨後$group荷蘭國際集團上firmaListesi_id推先前輸出值。最後一步是寫firmalarId集合。

db.firmaListesi.aggregate([ 
    {$unwind:"$value"}, 
    {$lookup: { 
     from: "calisanSayisi", 
     localField: "value", 
     foreignField: "_id", 
     as: "b" 
    }}, 
    {$unwind: {path: "$b", preserveNullAndEmptyArrays: true}}, 
    {$group: {_id:"$_id", value:{$push:"$b"}}}, 
    {$out: "firmalarId"} 
]) 
+0

謝謝:) @Veeram – forguta