2017-04-04 28 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 'となります。このように2つのコレクションを結合したいと思います。私が書いたコードには誤りがあります。しかし、1つのエリアではこれが機能します。あなたは私が写真でもっと欲しいものを見ることができます。私はすべての分野の写真を撮りたい。

マイ結果

{ 
    "_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); 
} 

コード内の主要な障害があります。しかし、私は解決策を見つけることができません。手伝ってくれる?

EDIT

'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バージョンでは必要ありません)valueフィールドのフィールドから$lookコレクションのcalisanSayisiコレクションのこれらのObjectIdまで、bアレイにあります。

次のステップは、前の出力値をプッシュするfirmaListesi_idにINGのb$unwindに出力アレイと$groupが続きます。最後のステップは、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