考虑以下集合:
{ "_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,但我无法得到我需要的结果。
答案 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"}}}
)