【问题标题】:Mongodb group and sum two arrays of similar data from aggregate facetMongodb对来自聚合方面的两个相似数据数组进行分组和求和
【发布时间】:2018-02-16 10:18:45
【问题描述】:

我正在运行针对不同级别的社交数据的查询,并且已经使用一些相当大的聚合管道来实现这一点,然后这些管道在 $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
    ]
}]

我有一个查询将各个响应分组以使它们达到此级别,但缺少一些允许我跨两个数组合并的内容。我已经尝试展开第一个和第二个数组,但无法找到将两个数组中的数据结合起来的解决方案。

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

【问题讨论】:

  • 我尝试展开一个数组并考虑将其分组,然后展开另一个数组,这是一个相当标准的解决方案,但由于我尝试配对的数据跨两个数组,这实际上并不帮助分组。我已经解开了两个数组,这会产生一堆重复,但可能是唯一的选择,因为我不能在“第一”和“第二”数组本身上运行一个组,需要先将数组分开。
  • 一旦它们被打破,我仍然需要删除包装对象,因为它会遮蔽 id 的路径等。例如。 first: { _id, date, data }, second: { _id, date, data } 第一个和第二个标志可以说是“挡道”。
  • 解围后的小组赛阶段是我可以写的 - $group: { _id: { name: '$first._id.brand', _id: '$first._id ._id', }, date: { $push: '$first._id.date' }, } 但显然这并没有合并第二个数据
  • 你可以试试db.collection_name.aggregate([{"$project":{"combine":{$concatArrays:["$first", "$second"]}}}, {"$unwind":"$combine"}, {"$group":{"_id":"$combine._id", "date":{"$first":{$arrayElemAt:["$combine.date", 0]}},"data":{"$sum":{$arrayElemAt:["$combine.data", 0]}}}}])。如果您添加当前的聚合查询以避免值首先作为数组结束,您可以更好地回答。
  • @Veeram 你建议的数组 concat 正是我需要的。如果你想把它变成一个答案,我会投赞成票。我认为您能够在聚合链的上游进一步调整查询可能是对的,但目前它是 2 个 9 级管道包裹在一个方面,并且该方面产生两个数组。

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


【解决方案1】:

使用$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
          ]
        }
      }
    }
  }
]

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 2010-12-09
    • 2020-06-29
    • 2023-01-20
    • 2020-01-26
    • 2014-12-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多