2017-11-24 2 views
0

私のMongoDBドキュメントには、元のドキュメントと同様の項目を持つ配列プロパティがあります。新しいドキュメントへの平坦化されていない配列と出力への追加

私は配列プロパティをほどくと、親の後にそれを追加したいと思います:

現在の構造:

{ 
    _id: "1", 
    name: "Test1, 
    children: [ 
     {   
     _id: "2", 
     name: "Test2" 
     }, { 
     _id: "3", 
     name: "Test3" 
     }] 
} 

最終的な結果は次のようになります。私が試した

[{ 
    _id: "1", 
    name: "Test1 
}, 
{ 
    _id: "2", 
    name: "Test2 
},{ 
    _id: "3", 
    name: "Test3 
}] 

$ unwindを使用していますが、同じチルダのプロパティで巻き戻されます。

{ 
    path : "$children", 
    preserveNullAndEmptyArrays : false // optional 
} 

答えて

0

例文書とあなたが期待結果に基づいて、あなたが試みることができるが:

db.collection.aggregate([ 
      { "$project": { tmp : { 
          "$concatArrays":[ 
             "$children" , 
             [ {_id:"$_id", "name": "$name"}] 
             ] 
           } 
         } 
      }, 
      { "$unwind" :"$tmp"}, 
      { "$replaceRoot" : {newRoot: "$tmp"}}] 
) 

$project operatorは一時的なフィールドに、配列children内のすべてのエントリとルートレベル_idnameを組み合わせ、combine arrays using $concatArrays operatorにありますtmpと呼ばれます。

{"_id":1,"tmp":[ 
       {"_id":2,"name":"Test2"}, 
       {"_id":3,"name":"Test3"}, 
       {"_id":1,"name":"Test1"} ]  
} 

上記のステージの後、3つの要素の配列があります。 $unwind operatorを活用し、我々は配列要素をほどかことができます。

{"_id":1,"tmp":{"_id":2,"name":"Test2"}}, 
{"_id":1,"tmp":{"_id":3,"name":"Test3"}}, 
{"_id":1,"tmp":{"_id":1,"name":"Test1"}} 

最後に、我々はルートレベルにサブ文書を持参し、tmpフィールドを削除するには$replaceRootを使用しています。

{"_id":2,"name":"Test2"}, 
{"_id":3,"name":"Test3"}, 
{"_id":1,"name":"Test1"} 
関連する問題