Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用过滤数组和过滤总和聚合分组?_Node.js_Mongodb_Aggregation Framework - Fatal编程技术网

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或将其展开以获得所需的结果

哇,我不知道我怎么会没有想到这一点。这比我想象的要简单得多。非常感谢你!