Mongodb 查找数组中的最大元素
参考: 回答并建议使用sort+limit(1),但是这非常慢。当然有一种方法可以使用$max操作符 假设一个人在聚合匹配中得到这样的文档: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 } ]
{
_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" }
]
}
]
}
}}
])