Fal*_*Ger 12 mongodb mongodb-query aggregation-framework
REF:来自具有字段值 max 的数组的 MongoDB 文档
查找文档中的子数组中的最高值和MongoDB查找文档数组中的最大值中的答案建议使用排序+限制(1),但这确实很慢。当然有一种方法可以使用 $max 运算符。
假设在聚合匹配中获得这样的文档:
{
_id: "notImportant",
array: [
{
name: "Peter",
age: 17
},
{
name: "Carl",
age: 21
},
{
name: "Ben",
age: 15
}
]
}
Run Code Online (Sandbox Code Playgroud)
您想要找到年龄最高的(整个,而不仅仅是一个值)文档。如何使用 $max 运算符做到这一点?
我试过
unwind {"$array"}
project {"_id": 0, "name": "$array.name", "age": "$array.age"}
Run Code Online (Sandbox Code Playgroud)
所以我得到
{
_id: null,
name: "Peter",
age: 17
}
{
_id: null,
name: "Carl",
age: 21
}
{
_id: null,
name: "Ben",
age: 15
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试匹配年龄:
age: {$eq: {$max: "$age"}}
Run Code Online (Sandbox Code Playgroud)
,但这没有给我任何结果。
换句话说,我需要获取的是属于数组中最年长的人的姓名和所有其他字段。有成千上万的人,有很多属性,最重要的是它都在树莓派上运行。我需要对几十个这样的数组执行此操作。因此,排序总共需要大约 40 秒。所以我真的不想使用排序。
你可以尝试这个聚合吗$reduce
db.t63.aggregate([
{$addFields : {array : {$reduce : {
input : "$array",
initialValue : {age : 0},
in : {$cond: [{$gte : ["$$this.age", "$$value.age"]},"$$this", "$$value"]}}
}}}
])
Run Code Online (Sandbox Code Playgroud)
输出
{ "_id" : "notImportant", "array" : { "name" : "Carl", "age" : 21 } }
Run Code Online (Sandbox Code Playgroud)
如果您想要所有具有最高价值的文档,您应该使用过滤器。所以基本上,不要使用那些展开、项目等,只需使用下面的项目阶段
$project: {
age: {
$filter: {
input: "$array",
as: "item",
cond: { $eq: ["$$item.age", { $max: "$array.age" }] }
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用下面aggregation
db.collection.aggregate([
{ "$project": {
"max": {
"$arrayElemAt": [
"$array",
{
"$indexOfArray": [
"$array.age",
{ "$max": "$array.age" }
]
}
]
}
}}
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11658 次 |
| 最近记录: |