【发布时间】:2017-02-13 15:19:34
【问题描述】:
我有一个给定的数组A = [5, 15, 25, 35]。
我有一个集合 C。它的所有文档都有字段“数字”,它是一个长度可变的数字数组。
我想匹配所有具有“数字”元素的文档,其中至少有 A 的 4 个元素中的 2 个。我应该如何有效地进行?
最好使用 find 而不需要聚合。
谢谢。
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework
我有一个给定的数组A = [5, 15, 25, 35]。
我有一个集合 C。它的所有文档都有字段“数字”,它是一个长度可变的数字数组。
我想匹配所有具有“数字”元素的文档,其中至少有 A 的 4 个元素中的 2 个。我应该如何有效地进行?
最好使用 find 而不需要聚合。
谢谢。
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework
使用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]}}
]
})
【讨论】: