2017-04-14 60 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