【发布时间】:2019-10-21 03:32:15
【问题描述】:
我需要对 x 字段进行分组并获取其他字段的最大值。是的,使用$max 我们可以获得最大重复值。但是,我还需要得到 count $max 的百分比/计数值。换句话说,这个$max 值在该组中存在多少次。请帮忙。
示例:
db.getCollection("test").aggregate(
[
{ "$match" : { "doc_id" : 1.0 } },
{ "$group" : {
"_id" : { "name" : "$name" },
"total" : { "$sum" : "$amount" },
"l1_max" : { "$max" : "$l1" }
}
},
]
);
在这里,我收到 l1_max = 'Computer' 。但是,我需要它为'Computer - (30%) Total 4/12'
更新:2019 年 10 月 20 日 @mickl:感谢您的回答。
字段 l1 实际上是一个引用字段。在普通的 find/project 或 mongoose populate() 中,它有助于从其他集合中获取字段。例子: 如果 l1 是 ObjectId 类型,那么,
l1: {
_id, "4343434343sdsdsY",
name: "IT"
}
所以 l1.name 将从 project/populate 函数中的另一个集合中获取 name 字段。
我执行了以下代码:
db.getCollection("test").aggregate(
[
{ "$match" : { "doc_id" : 1.0 } },
{ "$group" : {
"_id" : { "name" : "$name" },
"total" : { "$sum" : "$amount" },
"count": { '$sum': 1 },
"l1_max" : { "$max" : "$l1" },
"l1_values": { $push: "$l1" }
}
},
{
$project: {
_id: 1,
total: 1,
l1 : {"_id": "$l1_max", "count": "$count", "percent": { $divide: [ { $size: { $filter: { input: "$l1_values", cond: { $eq: [ "$$this", "$l1_max" ] } } } },"$count"]}}
}
}
]
);
答案如下:但我也需要引用 name 字段。
{
"_id" : {
"name" : "xzy"
},
"total" : 35.0,
"l1" : {
"_id" : "4343920239201W",
"name" : "IT", // **MISSING**
"count" : 4.0,
"percent" : 0.25
}
}
希望我这次清楚了。
【问题讨论】:
-
能否添加样本集合 json 和预期输出
标签: mongodb aggregation-framework