Mongodb 查找数组中的最大元素

Mongodb 查找数组中的最大元素,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,参考: 回答并建议使用sort+limit(1),但是这非常慢。当然有一种方法可以使用$max操作符 假设一个人在聚合匹配中得到这样的文档: { _id: "notImportant", array: [ { name: "Peter", age: 17 }, { name: "Carl", age: 21 }, { name: "Ben", age: 15 } ]

参考:

回答并建议使用sort+limit(1),但是这非常慢。当然有一种方法可以使用$max操作符

假设一个人在聚合匹配中得到这样的文档:

{
  _id: "notImportant",
  array: [
    {
      name: "Peter",
      age: 17
    },
    {
      name: "Carl",
      age: 21
    },
    {
      name: "Ben",
      age: 15
    }
  ]
}
您希望找到年龄最高的文档(整个文档,而不仅仅是一个值)。 如何使用$max操作符实现这一点

我试过了

unwind {"$array"}
project {"_id": 0, "name": "$array.name", "age": "$array.age"}
所以我明白了

{
  _id: null,
  name: "Peter",
  age: 17
}
{
  _id: null,
  name: "Carl",
  age: 21
}
{
  _id: null,
  name: "Ben",
  age: 15
}
然后我尝试匹配年龄:

age: {$eq: {$max: "$age"}}
,但这并没有给我任何结果


换句话说,我需要得到的是数组中最老的人的名字和所有其他字段。有成千上万的人,有很多属性,最重要的是它运行在树莓皮上。我需要在几十个这样的阵列上做这个操作。所以排序总共需要40秒。所以我真的不想使用排序。

你能用
$reduce

db.t63.aggregate([
    {$addFields : {array : {$reduce : {
        input : "$array", 
        initialValue : {age : 0}, 
        in : {$cond: [{$gte : ["$$this.age", "$$value.age"]},"$$this", "$$value"]}}
    }}}
])
输出

{ "_id" : "notImportant", "array" : { "name" : "Carl", "age" : 21 } }

如果您想要所有具有最高值的文档,则应使用筛选器。 因此,基本上,不要使用那些放松、项目等,只需使用下面的项目阶段

                $project: {
                    age: {
                        $filter: {
                            input: "$array",
                            as: "item",
                            cond: { $eq: ["$$item.age", { $max: "$array.age" }] }
                        }
                    }
                }
你可以在下面使用


标记副本中的一个答案使用了
$max
,该答案的最大值为K,最大值为V,但它们不相关。在我的例子中,如果有一个身高属性,让人们给出他们的身高,它将返回最大身高和最大年龄,但他们可能与同一个人无关(数组中的条目)。或者我有什么地方出错了吗?@chridam这个问题有更好的答案。没有
$unwind
:-)这是迄今为止最灵活的答案。因为我也需要过滤年龄(最小值和最大值之间),这对我来说是可行的。
db.collection.aggregate([
  { "$project": {
    "max": {
      "$arrayElemAt": [
        "$array",
        {
          "$indexOfArray": [
            "$array.age",
            { "$max": "$array.age" }
          ]
        }
      ]
    }
  }}
])