mongodb - Mongodb Group by get $max 和 max 的值和该组的百分比
问题描述
我需要对 x 字段进行分组并获取其他字段的最大值。是的,使用$max
我们可以获得最大重复值。但是,我也需要获得$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'
更新:20/10/2019 @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"]}}
}
}
]
);
答案如下:但我也需要引用名称字段。
{
"_id" : {
"name" : "xzy"
},
"total" : 35.0,
"l1" : {
"_id" : "4343920239201W",
"name" : "IT", // **MISSING**
"count" : 4.0,
"percent" : 0.25
}
}
希望这次我清楚了。
解决方案
您需要捕获组中的所有值并使用$divide、$filter和$sizel1
计算百分比:
db.getCollection("test").aggregate(
[
{ "$match" : { "doc_id" : 1.0 } },
{ "$group" : {
"_id" : { "name" : "$name" },
"total" : { "$sum" : "$amount" },
"l1_max" : { "$max" : "$l1" },
"l1_values": { $push: "$l1" }
}
},
{
$project: {
_id: 1,
total: 1,
l1_max: 1,
l1_perc: {
$divide: [
{ $size: { $filter: { input: "$l1_values", cond: { $eq: [ "$$this", "$l1_max" ] } } } },
{ $size: "$l1_values" }
]
}
}
}
]
);
推荐阅读
- json - 意外元素:CDATA soapUI maven 插件
- html - 两排粘顶
- javascript - 如何在Javascript中将数组转换为字典(也将列重新排序为行)?
- javascript - 我如何循环一个函数
- java - 在静态方法中使用 Spring Data Repositories
- java - Api 23:NetworkScheduler:指定的组件无效。错误
- php - 找到数组中的第一个元素并将其放在开头
- excel - IF/AND + INDEX/MATCH 公式可以根据多个条件提取值吗?
- null - simplefunge - NilClass 错误,即使堆栈顶部不为空
- flutter - 如何在 Flutter 中模糊 Container 或 Any 小部件