2017-02-17 231 views
2

我有一個記錄,如下列:

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

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

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

我想聯盟的兩個數據陣列。

例如,如果我想找到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}

這是僅id 1的數據。

如何實現同一數組字段上的兩個或多個文檔之間的聯合?

PS:我使用MongoDB的3.4

回答

6

要獲得更高效的查詢,請使用運算符來壓扁數組。這將允許您連接任意數量的數組,所以不是僅僅從文檔1和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

只使用$last,而不是$firsts1

因此該查詢:

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

謝謝!這樣可行。如果我想在兩個以上的文件上進行聯合會怎麼樣?如果我想要使用ID 1,2和3的聯合數據,那麼組塊將會是什麼? –