2017-04-04 145 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