Node.js 如何使用过滤数组和过滤总和聚合分组?
我正试图了解这个聚合框架,我有点卡住了,我希望能得到一些帮助 因此,我收集了一组事件,这些事件经过简化和过滤,看起来类似于:Node.js 如何使用过滤数组和过滤总和聚合分组?,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我正试图了解这个聚合框架,我有点卡住了,我希望能得到一些帮助 因此,我收集了一组事件,这些事件经过简化和过滤,看起来类似于: { creation: 54233, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 5 } }, { creation: 64033, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data
{ creation: 54233, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 5 } },
{ creation: 64033, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 3 } },
{ creation: 50298, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 2 } },
{ creation: 74220, eventName: "toggle", userId: 1, url: "/thing/53e245ca", data: { status: true } },
{ creation: 84233, eventName: "elapsedTime", userId: 2, url: "/thing/190345a9", data: { number: 8 } },
{ creation: 59511, eventName: "elapsedTime", userId: 2, url: "/thing/190345a9", data: { number: 10 } },
{ creation: 14236, eventName: "toggle", userId: 2, url: "/thing/190345a9", data: { status: false } },
{ creation: 80637, eventName: "toggle", userId: 2, url: "/thing/cc2b8b91", data: { status: true } },
{ creation: 99239, eventName: "toggle", userId: 2, url: "/thing/cc2b8b91", data: { status: false } }
我希望它们可以这样聚合:
{
userId: 1,
toggles: [
{ creation: 74220, url: "/thing/53e245ca", data: { status: true } }
],
elapsedSum: 10
},
{
userId: 2,
toggles: [
{ creation: 14236, url: "/thing/190345a9", data: { status: false } },
{ creation: 80637, url: "/thing/cc2b8b91", data: { status: true } },
{ creation: 99239, url: "/thing/cc2b8b91", data: { status: false } },
],
elapsedSum: 18
}
因此,我基本上希望按用户分组,为每个用户计算所有elapsedTime
的总和,并为每个用户设置一个所有toggle
事件的数组
db.getCollection('heya').aggregate([
{
"$group": {
"_id": "$userId",
"toogles": {
"$addToSet": {
"$cond": {
"if": {
"$eq": [
"$eventName",
"toggle"
]
},
"then": {
"creation": "$creation",
"url": "$url",
"data": "$data"
},
"else": null
}
}
},
"elapsedSum": {
"$sum": {
"$cond": {
"if": {
"$eq": [
"$eventName",
"elapsedTime"
]
},
"then": "$data.number",
"else": 0
}
}
}
}
}
])
您可以从数组中替换null或将其展开以获得所需的结果哇,我不知道我怎么会没有想到这一点。这比我想象的要简单得多。非常感谢你!