如何解决如何按多个字段对一组子文档进行分组?
我已经花了一天的大部分时间在这上面,现在已经没有想法了。这是我的收藏:
[
{
"_id": "ID_XXX","logs": [
{
"lead_id": 123,"list_id": "list_44","order_id": "order_1"
},{
"lead_id": 124,"order_id": "order_2"
}
]
},{
"_id": "ID_YYY","logs": [
{
"lead_id": 125,"order_id": "order_2"
},{
"lead_id": 126,{
"lead_id": 127,"order_id": "order_3"
},{
"lead_id": 128,"list_id": "list_66","order_id": "order_3"
}
]
}
]
我只是想获得 list_id
和 order_id
的计数,同时保留它们所在文档的 _id
。这是我想要的输出:
[
{
"_id": "ID_XXX","counts": [
{
"lists": {"list_44": 2},},{
"orders": {"order_1": 1,"order_2": 1}
}
]
},"counts": [
{
"lists": {"list_44": 3,"list_66": 1},{
"orders": {"order_2": 2,"order_3": 2}
}
]
}
]
我尝试了太多汇总变体,无法在此列出,但最新的是:
db.collection.aggregate([
{
$unwind: "$logs"
},{
$group: {
_id: "$_id",lists: {
$push: "$logs.list_id"
},orders: {
$push: "$logs.order_id"
}
}
}
])
这并没有给我我想要的。任何人都可以指出我正确的方向吗?这是游乐场链接:https://mongoplayground.net/p/f-jk7lbSrJ0
解决方法
-
$reduce
迭代logs
的循环,使用logs
、$objectToArray
将$concatArrays
对象转换为 k(key) v(value) 格式的数组$reduce
中的初始值, -
$filter
以上将结果缩减为输入并过滤logs
中的必填字段 -
$unwind
解构logs
数组
db.collection.aggregate([
{
$addFields: {
logs: {
$filter: {
input: {
$reduce: {
input: "$logs",initialValue: [],in: { $concatArrays: ["$$value",{ $objectToArray: "$$this" }] }
}
},cond: { $in: ["$$this.k",["list_id","order_id"]] }
}
}
}
},{ $unwind: "$logs" },
-
$group
通过_id
和logs
对象并使用$sum
获取总数
{
$group: {
_id: {
_id: "$_id",logs: "$logs"
},counts: { $sum: 1 }
}
},
-
$group
by_id
并制作lists
数组,如果logs.k
为list_id
,否则以 k 和 v 格式返回$$REMOVE
,同fororders
在order_id
的基础上创建一个订单数组
-
$addFields
使用 $arrayToObjectlists
orders` 数组将and same as for
数组从 k 和 v 格式转换为对象格式
{
$group: {
_id: "$_id._id",lists: {
$push: {
$cond: [
{ $eq: ["$_id.logs.k","list_id"] },{
k: "$_id.logs.v",v: "$counts"
},"$$REMOVE"
]
}
},orders: {
$push: {
$cond: [
{ $eq: ["$_id.logs.k","order_id"] },"$$REMOVE"
]
}
}
}
},{
$addFields: {
lists: { $arrayToObject: "$lists" },orders: { $arrayToObject: "$orders" }
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。