Mongodb对来自聚合方面的两个相似数据数组进行分组和求和

Posted

技术标签:

【中文标题】Mongodb对来自聚合方面的两个相似数据数组进行分组和求和【英文标题】:Mongodb group and sum two arrays of similar data from aggregate facet 【发布时间】: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 级管道包裹在一个方面,并且该方面产生两个数组。 【参考方案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
          ]
        
      
    
  
]

【讨论】:

以上是关于Mongodb对来自聚合方面的两个相似数据数组进行分组和求和的主要内容,如果未能解决你的问题,请参考以下文章

如何对对象数据的mongodb聚合数组进行分组以对同一日期的数字求和

走进MongoDB

如何在 Mongodb 中对多个数组使用聚合映射和过滤器

两个集合的聚合数组 mongodb

MongoDB 实用数组聚合操作 (2)

MongoDB聚合(Aggregation Pipeline基础篇上