Mongodb组并汇总来自聚合方面

时间:2017-09-07 15:39:17

标签: arrays node.js mongodb mongoose mongodb-query

我正在运行针对不同级别的社交数据的查询,并且已经使用了一些相当大的聚合管道,然后在$ facet内运行。 $ facet部分的结果出现了两个我想要组合的数组。例如

{
"first": [
    {
        "_id": {
            "name": "one",
            "_id": "1"
        },
        "date": [
            "2017-09-07T00:00:00.000Z"
        ],
        "data": [
            1000
        ]
    },
    {
        "_id": {
            "name": "two",
            "_id": "2"
        },
        "date": [
            "2017-09-07T00:00:00.000Z"
        ],
        "data": [
            2000
        ]
    }
],
"second": [
    {
        "_id": {
            "name": "1",
            "_id": "one"
        },
        "date": [
            "2017-09-07T00:00:00.000Z"
        ],
        "data": [
            1000
        ]
    },
    {
        "_id": {
            "name": "two",
            "_id": "2"
        },
        "date": [
            "2017-09-07T00:00:00.000Z"
        ],
        "data": [
            2000
        ]
    }
]
}

我想将这些结果组合在一起并将总数加起来以

结尾
[ {
    "_id": {
        "name": "1",
        "_id": "one"
    },
    "date": [
        "2017-09-07T00:00:00.000Z"
    ],
    "data": [
        2000
    ]
},{
    "_id": {
        "name": "2",
        "_id": "two"
    },
    "date": [
        "2017-09-07T00:00:00.000Z"
    ],
    "data": [
        4000
    ]
}]

我有一个查询,它将各个响应分组以使它们达到此级别,但是缺少允许我跨两个数组合并的内容。我已经尝试解开第一个和第二个阵列但是还没有能够找到一个结合两个阵列数据的解决方案。

非常感谢任何帮助,提示或知识。

1 个答案:

答案 0 :(得分:0)

使用$concatArrays合并来自$facets输出的数组,然后将$group$arrayElemAt合并,以选择$first$sum累加器的第一个元素

[
  {
    "$project": {
      "combine": {
        "$concatArrays": [
          "$first",
          "$second"
        ]
      }
    }
  },
  {
    "$unwind": "$combine"
  },
  {
    "$group": {
      "_id": "$combine._id",
      "date": {
        "$first": {
          "$arrayElemAt": [
            "$combine.date",
            0
          ]
        }
      },
      "data": {
        "$sum": {
          "$arrayElemAt": [
            "$combine.data",
            0
          ]
        }
      }
    }
  }
]