查找其数组字段至少包含给定数组的n个元素的文档

时间:2016-06-09 12:13:03

标签: mongodb mongoose aggregation-framework

这基本上就是标题所说的。

输入:myArray =一个单词数组

我有一个有字段的模型 wordsCollection,这是一个数组字段。

如何查找wordsCollections至少包含myArray

的n个元素的模型的所有文档

2 个答案:

答案 0 :(得分:6)

假设我们的收藏中有以下文件:

{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d03"), "a" : [ 0, 8, 432, 9, 34, -3 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }

以及以下输入数组和n = 2

var inputArray = [1, 3, 0];

我们可以使用聚合框架返回数组字段至少包含给定数组的n个元素的那些文档。

$match仅选择阵列长度大于或等于n的文档。这减少了管道中要处理的数据量。

$redact管道运算符使用$cond运算符和特殊运算$$KEEP使用逻辑条件处理来“保留”逻辑条件为真的文档或{{3} }“丢弃”条件为假的文件。

在我们的例子中,条件是$$PRUNE如果我们使用$gte运算符计算的两个数组的交集的$size大于或等于$setIntersection,则返回true {1}}。

2

产生:

db.collection.aggregate(
    [ 
        { "$match": { "a.1": { "$exists": true } } }, 
        { "$redact": { 
            "$cond": [ 
                { "$gte": [ 
                    { "$size": { "$setIntersection": [ "$a", inputArray ] } }, 
                    2
                ]},
                "$$KEEP", 
                "$$PRUNE" 
            ]
        }}
    ]
)

答案 1 :(得分:0)

使用聚合。

$match汇总管道中,您可以使用$size$gte