Javascript Mongo将多个文档聚合为一个文档
我试图通过mongodb.collection.aggregate()命令合并一些复杂的文档 假设我想要合并集合文档的x(在下面的示例中:x=2):Javascript Mongo将多个文档聚合为一个文档,javascript,mongodb,aggregate,Javascript,Mongodb,Aggregate,我试图通过mongodb.collection.aggregate()命令合并一些复杂的文档 假设我想要合并集合文档的x(在下面的示例中:x=2): [ { “_id”:1, “数据”:{ “儿童”:{ "1": { “名称”:“仅在第一个文档中显示”, “成本”:1, “收入”:4.5, “孙子女”:{ “1t9dsqdqdvoj8pdppxjk”:{ “成本”:0, “收入”:1.5 } } }, "2": { “名称”:“出现在两个文档中”, “成本”:2, “收入”:7, “孙子女”:{
[
{
“_id”:1,
“数据”:{
“儿童”:{
"1": {
“名称”:“仅在第一个文档中显示”,
“成本”:1,
“收入”:4.5,
“孙子女”:{
“1t9dsqdqdvoj8pdppxjk”:{
“成本”:0,
“收入”:1.5
}
}
},
"2": {
“名称”:“出现在两个文档中”,
“成本”:2,
“收入”:7,
“孙子女”:{
“jesrdt5qwef2222dgt”:{
“成本”:1,
“收入”:3
},
“klh352hk5367kf”:{
“成本”:2,
“收入”:7
}
}
}
}
}
},
{
“_id”:2,
“数据”:{
“儿童”:{
"2": {
“名称”:“出现在两个文档中,但名称不同”,
“成本”:9,
“收入”:7,
“孙子女”:{
“AAAAAAAA”:{
“成本”:3,
“收入”:2
},
“jesrdt5qwef2222dgt”:{
“成本”:6,
“收入”:5
}
}
},
"3": {
“名称”:“仅出现在上次单据中”,
“成本”:4,
“收入”:2,
“孙子女”:{
“CCCC”:{
“成本”:4,
“收入”:2
}
}
}
}
}
}
]
挑战:
{
“数据”:{
“儿童”:{
"1": {
“名称”:“仅在第一个文档中显示”,
“成本”:1,
“收入”:4.5,
“孙子女”:{
“1t9dsqdqdvoj8pdppxjk”:{
“成本”:0,
“收入”:1.5
}
}
},
"2": {
“名称”:“出现在两个文档中,但名称不同”,
“成本”:11,
“收入”:14,
“孙子女”:{
“AAAAAAAA”:{
“成本”:3,
“收入”:2
},
“jesrdt5qwef2222dgt”:{
“成本”:7,
“收入”:8
},
“klh352hk5367kf”:{
“成本”:2,
“收入”:7
}
}
},
"3": {
“名称”:“仅出现在上次单据中”,
“成本”:4,
“收入”:2,
“孙子女”:{
“CCCC”:{
“成本”:4,
“收入”:2
}
}
}
}
}
}
这是一个有点长的过程,可能会有一些简单的过程,我只是在分享这个过程
将$project
转换为数组格式(k,v)子项
deconstruct$unwind
arraychildren
按子项,对$group
和成本
进行求和,并使用收入
获取last$last
名称
解构$unwind
数组孙子辈
将$addFields
转换为数组格式(k,v)孙子辈
解构$unwind
数组孙子辈
按$group
键和子项
键,计算孙子项的成本和收入之和孙子项
按$group
键并重新构造子项
数组子项
按$group
重新构造子数组,并使用null
将$arrayToObject
从(k,v)数组转换为对象孙辈
使用$project
$arrayToObject
太棒了!先生,你真是个职业选手!!我可以在操场上看到一切都很好,所以我将开始阅读您添加的功能-THX!只有一件事不能正常工作:id为“2”的孩子的成本和收入取最后的值,而不是总和(孙子孙女的总和是正确的)好的,很抱歉,这将很快检查并更新您。
db.collection.aggregate([
{ $project: { "Data.children": { $objectToArray: "$Data.children" } } },
{ $unwind: "$Data.children" },
{
$group: {
_id: "$Data.children.k",
name: { $last: "$Data.children.v.name" },
cost: { $sum: "$Data.children.v.cost" },
revenue: { $sum: "$Data.children.v.revenue" },
grandchildren: { $push: "$Data.children.v.grandchildren" }
}
},
{ $unwind: "$grandchildren" },
{ $addFields: { grandchildren: { $objectToArray: "$grandchildren" } } },
{ $unwind: "$grandchildren" },
{
$group: {
_id: {
ck: "$_id",
gck: "$grandchildren.k"
},
cost: { $first: "$cost" },
revenue: { $first: "$revenue" },
name: { $first: "$name" },
grandchildren_cost: { $sum: "$grandchildren.v.cost" },
grandchildren_revenue: { $sum: "$grandchildren.v.revenue" }
}
},
{
$group: {
_id: "$_id.ck",
cost: { $first: "$cost" },
revenue: { $first: "$revenue" },
name: { $last: "$name" },
grandchildren: {
$push: {
k: "$_id.gck",
v: {
cost: "$grandchildren_cost",
revenue: "$grandchildren_revenue"
}
}
}
}
},
{
$group: {
_id: null,
children: {
$push: {
k: "$_id",
v: {
name: "$name",
cost: "$cost",
revenue: "$revenue",
grandchildren: { $arrayToObject: "$grandchildren" }
}
}
}
}
},
{
$project: {
_id: 0,
"Data.children": { $arrayToObject: "$children" }
}
}
])