我在Mongo有这样的文件:
{
_id: 1,
cat: ['a', 'b, 'c', 'd', 'e']
},
{
_id: 2,
cat: ['f', 'g, 'h', 'i', 'j']
},
{
_id: 3,
cat: ['a', 'b, 'f', 'g', 'h']
},
{
_id: 4,
cat: ['i', 'j, 'c', 'd', 'e']
}
我必须在我拥有的集合中过滤至少n次出现(让'说3')'cat'的文件,即:
['a', 'b', 'c', 'f']
因此,在这种情况下,只应返回_id等于1和3的文档,因为它们都至少有3次出现在请求的数组中。
解决此问题的最佳方法是什么? 我应该继续聚合框架,还是有没有简单的方法可以做到?
答案 0 :(得分:2)
您可以使用$setIntersection运算符
来实现此目的db.collection.aggregate(
[
{$project: {cat: 1, inter: { $setIntersection: [ "$cat", ['a', 'b', 'c', 'f'] ] } } },
{$project: {cat: 1, size: {$size: "$inter"}}},
{$match: {size: {$gte: 3}}}
]
)
输出:
{ "_id" : 1, "cat" : [ "a", "b", "c", "d", "e" ], "size" : 3 }
{ "_id" : 3, "cat" : [ "a", "b", "f", "g", "h" ], "size" : 3 }
答案 1 :(得分:1)
您可以尝试$redact
$setIntersection
来查询。
$setIntersection
将cat
数组与输入数组进行比较并返回公共名称文档的数组,后跟$size
和$redact
,并将结果与3进行比较以保留并删除文件。
db.collection.aggregate(
[{
$redact: {
$cond: {
if: {
$gte: [{
$size: {
$setIntersection: ["$cat", ['a', 'b', 'c', 'f']]
}
}, 3]
},
then: "$$KEEP",
else: "$$PRUNE"
}
}
}]
)