mongodb - 查找数组中最大值与查询匹配的所有 Mongo 文档

标签 mongodb mongodb-query aggregation-framework

给定如下的文档结构:

{
   values: [
      { value: 10 },
      { value: 20 },
      { value: 30 }
   ]
}

我想搜索数组中最大值与查询匹配的所有文档。

例如。如果我搜索最大值小于 25 的所有文档,则上面的示例将不会匹配,因为 30 > 25。

我该怎么做?

最佳答案

使用.aggregate()提供对聚合管道的访问的方法。

如果您使用的是 3.2 或更高版本,管道中的唯一阶段是 $redact您在哪里使用 $$KEEP$$PRUNE用于返回或丢弃不符合您的条件的文档的变量。在 $cond您使用 $max 的表达式运算符返回“values”数组中的最大值 $map 返回运算符,因为文档中提到的 $redact 阶段:

Incorporates the functionality of $project and $match

db.collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$lt": [ 
                { "$max": { 
                     "$map": { 
                         "input": "$values", 
                         "as": "value", 
                         "in": "$$value.value" 
                     }
                }}, 
                25
            ]}, 
            "$$KEEP", 
            "$$PRUNE" 
        ]
    }}
])

从版本 3.0 开始,您需要首先使用 $unwind 对“值”数组进行非规范化。然后运算符 $group您的文档由 _id 提供;使用 $max 计算最大值并使用 $push累加器运算符返回值数组。最后一个阶段是 $redact 阶段。

db.collection.aggregate([ 
    { "$unwind": "$values" }, 
    { "$group": { 
        "_id": "$_id", 
        "maxvalues": { "$max": "$values.value"}, 
        "values": { "$push": "$values" }
    }}, 
    { "$redact": { 
        "$cond": [
            { "$lt": [ "$maxvalues", 25 ] },
            "$$KEEP", 
            "$$PRUNE" 
        ]
    }}
])

关于mongodb - 查找数组中最大值与查询匹配的所有 Mongo 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34659676/

相关文章:

mongodb - 如何使用group by进行聚合并正确排序

mongodb - 在Logstash管道中将mongodb _id对象转换或转换为字符串

swift:如何使用 mongoDB Realm 数据库和身份验证保持 ios 用户登录

java - 对 Spring Data Mongo 存储库提供限制

mongodb - Ho 使用 $sum (聚合)作为对象数组,并检查每个总和是否大于

mongodb - 如何在 mongodb 中按多列和多个值进行分组

node.js - 如何从 mongoDB 获取多个文档?

php - 无法加载动态库'/opt/lampp/lib/php/extensions/no-debug-non-zts-20090626/mongo.so

node.js - 一次查询多个集合(mongodb)

php - 按国家、州和城市汇总