计算Mongodb中数组中的出现次数
我在Mongo有这样的文件:计算Mongodb中数组中的出现次数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在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',
{
_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次类别
解决这个问题的最好办法是什么?
我应该使用聚合框架吗?或者没有聚合框架有什么简单的方法吗?您可以使用操作符来实现这一点
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 }
在线试用:您可以使用运算符实现此功能
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 }
联机尝试:您可以使用
$setcrossion
尝试$redact
进行查询
$setIntersection
将cat
数组与公共名称文档的输入数组和返回数组进行比较,后跟$size
和$redact
,并将结果与3进行比较以保留文档,否则删除文档
db.collection.aggregate(
[{
$redact: {
$cond: {
if: {
$gte: [{
$size: {
$setIntersection: ["$cat", ['a', 'b', 'c', 'f']]
}
}, 3]
},
then: "$$KEEP",
else: "$$PRUNE"
}
}
}]
)
您可以使用
$setcrossion
尝试$redact
进行查询
$setIntersection
将cat
数组与公共名称文档的输入数组和返回数组进行比较,后跟$size
和$redact
,并将结果与3进行比较以保留文档,否则删除文档
db.collection.aggregate(
[{
$redact: {
$cond: {
if: {
$gte: [{
$size: {
$setIntersection: ["$cat", ['a', 'b', 'c', 'f']]
}
}, 3]
},
then: "$$KEEP",
else: "$$PRUNE"
}
}
}]
)
非常好和干净的解决方案!非常好和干净的解决方案!非常好和干净的解决方案!非常好和干净的解决方案!