【发布时间】: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