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对来自聚合方面的两个相似数据数组进行分组和求和的主要内容,如果未能解决你的问题,请参考以下文章