2017-04-14 44 views
0

數組值考慮以下集合:匹配ID和相交MongoDB中

{ "_id": "red", "c": [1, 1, 2, 3] } 
{ "_id": "green", "c": [4] } 
{ "_id": "blue", "c": [1, 2, 4] } 

由於未知數量的字符串(IDS)我想匹配字符串的文件,但也有一個共同的數字「 C」。
例如,對於["red", "blue"]的輸入,我會得到[1, 2]但輸入["red", "green"]我會得到[]

我想我需要使用$setIntersection但我無法得到我需要的結果。

回答

1

$setIntersection位於兩個陣列之間。它不適用於字符串數量未知的輸入。

您可以使用下面的聚合管道。

下面的查詢$unwind小號c陣列和計數所有c數組項第一$group隨後$match保持重複的條目。第二個$group$push的重複項分爲common數組。

更新:添加$setUnionc數組與[]設置爲刪除重複項。

db.collection.aggregate(
    {$match:{_id:{$in:["red", "blue"]}}}, 
    {$project:{c:{$setUnion:["$c",[]]}}}, 
    {$unwind:"$c"}, 
    {$group:{_id:"$c", count:{$sum:1}}}, 
    {$match:{count:{$gt:1}}}, 
    {$group:{_id:null, common:{$push:"$_id"}}} 
) 
+0

已更新的回答。添加'setUnion''c'數組,設置'[]'刪除重複項。 – Veeram

+0

優秀!我最初寫道,它重複失敗,然後我去看看我是否可以刪除我的數據中的重複,但你的更新解決了它! – tamir

+0

另外,有沒有辦法更新'''$ gt'''來支持任何大小的輸入數組?例如,對於'''[「紅色」,「藍色」,「黃色」]'''計數應該是''$ gt:2''' – tamir