在MongoDB

时间:2017-04-14 19:37:26

标签: 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 个答案:

答案 0 :(得分:1)

$setIntersection位于两个数组之间。对于包含未知字符串数的输入,它不起作用。

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

以下查询$unwind s c数组并计算第一个c中的所有$group数组条目,然后计算$match以保留重复条目。第二个$group$push将重复的条目转换为common数组。

更新:添加$setUnion c数组,并设置[]以删除重复项。

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"}}}
)