我有一个给定的数组A = [5, 15, 25, 35]
。
我有一个集合C.它的所有文件都有字段'numbers',这是一个数字数组,长度可变。
我想匹配所有作为'数字'元素的文件,至少有4个A元素中的2个。我应该如何有效地进行?
使用find并不需要聚合会很好。
谢谢。
答案 0 :(得分:0)
使用aggregation
很容易。您需要将$size
与$setIntersection
一起使用,然后将所有文档与元素匹配在交叉数组中至少2个数字:
db.C.aggregate([
{
$project: {
numbers: 1,
intersectedNumbers: {
$size: {
$setIntersection: ['$numbers', [5,15,25,35]]
}
}
}
},
{
$match: {
'intersectedNumbers': {
$gte: 2
}
}
}
])
使用find
时会出现更多问题,因为您需要两个阶段,如上面的aggregation
,而find
则不可能。
但是如果A
数组是动态的,你可以做的是创建一个函数,它将返回“至少2个”元素的所有可能性,然后使用$or
和$all
来使用find
:
db.C.find({
$or: [
{numbers: {$all: [5,15]}},
{numbers: {$all: [5,25]}},
{numbers: {$all: [5,35]}},
{numbers: {$all: [15,25]}},
{numbers: {$all: [15,35]}},
{numbers: {$all: [25,35]}}
]
})