通过一些数组项找到

时间:2016-10-05 08:58:10

标签: mongodb mongodb-query aggregation-framework

我有一个给定的数组A = [5, 15, 25, 35]

我有一个集合C.它的所有文件都有字段'numbers',这是一个数字数组,长度可变。

我想匹配所有作为'数字'元素的文件,至少有4个A元素中的2个。我应该如何有效地进行?

使用find并不需要聚合会很好。

谢谢。

1 个答案:

答案 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]}}
    ]
})