Arrays Mongodb对来自聚合方面的两个相似数据数组进行分组和求和
我正在运行针对不同级别的社会数据的查询,并且已经使用了一些相当大的聚合管道,然后在$facet中运行。 $facet部分的结果显示了两个数组,然后我想合并它们。例如Arrays Mongodb对来自聚合方面的两个相似数据数组进行分组和求和,arrays,node.js,mongodb,mongoose,mongodb-query,Arrays,Node.js,Mongodb,Mongoose,Mongodb Query,我正在运行针对不同级别的社会数据的查询,并且已经使用了一些相当大的聚合管道,然后在$facet中运行。 $facet部分的结果显示了两个数组,然后我想合并它们。例如 { "first": [ { "_id": { "name": "one", "_id": "1" }, "date": [ "2017-09-07T00:00:00.000Z" ],
{
"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
]
}]
我有一个查询,它将单个响应分组,以使它们达到此级别,但缺少允许我跨两个数组合并的内容。我曾尝试过展开第一个和第二个阵列,但未能找到跨两个阵列组合数据的解决方案
非常感谢您的帮助、提示或知识。使用
$concatarray
从$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
]
}
}
}
}
]
我曾尝试将一个数组展开,并将其分组,然后展开另一个数组,这是一个相当标准的解决方案,但由于我尝试配对的数据跨两个数组,这实际上无助于分组。我解开了两个数组,这会造成一系列重复,但这可能是唯一的选择,因为我无法在“第一”和“第二”数组上运行组,需要首先拆分数组。一旦拆分了数组,我仍然需要删除包装对象,因为它会模糊到id的路径等。例如:第一:{u id,date,data},第二:{u id,date,data}可以说,第一个和第二个标志是“挡道”。退绕后的分组阶段是我被耽搁的地方,我可以写-$group:{u id:{name:'$first.\u id.brand',\u id:'$first.\u id.\u id',},日期:{$push:'$first.\u id.date'}但是显然,这也不会合并第二个数据库中的数据。您可以尝试
db.collection\u name.aggregate([{“$project”:{“combine”:{$concatarray:[“$first”,“$second”]}},{“$undund”:“$combine”},{“$group”:{“$combine.\u id”,“date”:{“$first”:{$arrayElemAt[“$combine.date 0]},{“$sum”:{$arrayElemAt。如果添加当前聚合查询以避免值首先以数组形式结束,则可以更好地回答此问题。@Veeram您建议的数组concat正符合我的需要。如果你想把它变成一个答案,我会投票表决。我认为您可以在聚合链上进一步调整查询,这可能是对的,但目前它是用一个方面包装的29个阶段管道,这个方面生成两个数组。