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

标签 mongodb mongoose aggregation-framework

基本上就是标题所说的。

输入:myArray = 单词数组

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

如何找到该模型的所有文档,其 wordsCollections 至少有 n 个 myArray

元素

最佳答案

假设我们的集合中有以下文档:

{ "_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 来“保留”逻辑条件为真的文档或 $$PRUNE 来“丢弃”条件为假的文档。

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

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

产生:

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

关于mongodb - 查找其数组字段包含给定数组的至少 n 个元素的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725694/

相关文章:

javascript - Mongoose 尝试使用 Promise 处理预保存错误

spring - 无法连接到mongodb容器主机

javascript - meteor 路线未注册

mongodb - 在 MongoDB shell 查询中获取 "data from collection b not in collection a"

node.js - Mongoose 如何填充非 id 字段或如何手动实现并行 promise 填充

node.js - MongoDB、Mongoose - 获取 10k+ 文档时查询缓慢

node.js - "query"计算每个类别的帖子 expressjs mongoose

mongodb - 使用聚合查询删除 mongodb 中的重复项

MongoDB 聚合查询 - 重命名从嵌入式文档中返回的字段

javascript - 如何根据mongodb中引用文档中的字段进行查询