2017-02-17 9 views
2

私は次のようなレコードを持っている:

{ _id : 1 , data : [7,4,0] } 

{ _id : 2 , data : [4,5,6] } 

{ _id : 3 , data : [6,7,8] } 

私は2つのデータ・アレイ組合にしたいです。

私は、ID 1と2のデータ配列の組合を検索したい場合たとえば、私が使用しているクエリは次のとおりです。

db.coll.aggregate(
{ 
    $match : { 
     _id: { $in: [1, 2] } 
    } 
}, 
{ 
    $group: { 
     _id: 0, 
     s0: { $first: "$data"}, 
     s1: { $first: "$data"} 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     ans: { $setUnion: [ "$s0","$s1"]} 
    } 
} 
).pretty() 

しかし、答えは唯一

{7、です5,0}

これはid1のみのデータです。

同じ配列フィールドで2つ以上のドキュメント間の結合を達成する方法はありますか?

PS:私はちょうどs1

ため$lastの代わり$firstを使用

答えて

6

より効率的なクエリを行うには、$reduce演算子を使用して配列を平坦化します。これにより任意の数の配列を連結することができるので、ドキュメント1と2から2つの配列を結合するだけでなく、他の配列にも適用されます。

には、以下の集約演算を実行している考えてみましょう:

db.coll.aggregate([ 
    { "$match": { "_id": { "$in": [1, 2] } } }, 
    { 
     "$group": { 
      "_id": 0, 
      "data": { "$push": "$data" } 
     } 
    }, 
    { 
     "$project": { 
      "data": { 
       "$reduce": { 
        "input": "$data", 
        "initialValue": [], 
        "in": { "$setUnion": ["$$value", "$$this"] } 
       } 
      } 
     } 
    } 
]) 

サンプル出力

{ 
    "_id" : 0, 
    "data" : [ 0, 4, 5, 6, 7 ] 
} 
+0

交差点を実行したい場合、初期値は空になり、結果は空になりますが、入力はネストされた配列です – Ars

1

をMongoDBの3.4を使用しているので、クエリは次のようになります。

db.coll.aggregate(
{ 
    $match : { 
     _id: { $in: [1, 2] } 
    } 
}, 
{ 
    $group: { 
     _id: 0, 
     s0: { $first: "$data"}, 
     s1: { $last: "$data"} 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     ans: { $setUnion: [ "$s0","$s1"]} 
    } 
} 
).pretty() 

出力:

{ "ans" : [ 0, 4, 5, 6, 7 ] } 
+0

ありがとうございます!それは動作します。 2つ以上の文書で結合したいのですが? ID 1,2および3のデータを結合する場合、グループブロックは何ですか? –

関連する問題