Mongodb 使用公共数据合并内部数组 db.test.aggregate([ {“$unwind”:“$Data”}, {“$sort”:{“Data.cost”:-1}, {“$group”:{ “_id”:“$Data.name”, “数据”:{“$push”:“$Data”} }} ])

Mongodb 使用公共数据合并内部数组 db.test.aggregate([ {“$unwind”:“$Data”}, {“$sort”:{“Data.cost”:-1}, {“$group”:{ “_id”:“$Data.name”, “数据”:{“$push”:“$Data”} }} ]),mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在上面的问题上开了枪。它给我的结果如下: { “结果”:[{ “_id”:“abc” “数据”:[ { “uid”:“1…A”, “名称”:“abc”, “城市”:“巴黎”, “说明”:{ “事情”:[ { “水果”:{ “水果名称”:“苹果”, “水果价格”:“4美元” }, “花”:{ “花名”:“玫瑰”, “花卉价格”:“2美元” } } ] }, “成本”:“6美元” }, { “uid”:“1…B”, “名称”:“abc”, “城市”:“巴黎”, “说明”:{ “事情”:[ { “水

我在上面的问题上开了枪。它给我的结果如下:

{
“结果”:[{
“_id”:“abc”
“数据”:[
{
“uid”:“1…A”,
“名称”:“abc”,
“城市”:“巴黎”,
“说明”:{
“事情”:[
{
“水果”:{
“水果名称”:“苹果”,
“水果价格”:“4美元”
},
“花”:{
“花名”:“玫瑰”,
“花卉价格”:“2美元”
}
}
]
},
“成本”:“6美元”
},
{
“uid”:“1…B”,
“名称”:“abc”,
“城市”:“巴黎”,
“说明”:{
“事情”:[
{
“水果”:{
“水果名称”:“樱桃”,
“水果价格”:“3美元”
},
“花”:{
“花名”:“兰花”,
“花卉价格”:“2美元”
}
}
]
}, 
“成本”:“5美元”
}
]
}]
}
但我不希望这样的结果。如果“name”相同,我想合并这两个数据的“description”数组。 如下文所述:

{
“结果”:[{
“_id”:“abc”
“数据”:[
{
“uid”:“1…A”,
“名称”:“abc”,
“城市”:“巴黎”,
“说明”:{
“事情”:[
{
“水果”:{
“水果名称”:“苹果”,
“水果价格”:“4美元”
},
“花”:{
“花名”:“玫瑰”,
“花卉价格”:“2美元”
}
}
]
},
“说明”:{
“事情”:[
{
“水果”:{
“水果名称”:“樱桃”,
“水果价格”:“3美元”
},
“花”:{
“花名”:“兰花”,
“花卉价格”:“2美元”
}
}
]
}, 
“成本”:“6美元”
}
]
}]
}
有可能得到这样的结果吗?我在查询中必须做哪些更改?


谢谢。

您构建所需结果的方式根本不可能。原因是您基本上打破了或字典/关联数组(无论哪个术语更适合您)背后的原则,即不能有多个同名的键值

如果希望具有相同名称的多个键,则这些键必须包含在一个数组中,该数组非常类似于现有的结构类型,也包含在结果中。这个结果除了对数组元素进行排序,然后将它们重新分组到一个数组中之外,实际上什么也做不了

因此,在这里给您一点空间,因为您只需进行复制和粘贴来表示所需的结果,并且您实际上需要某种形式的内部元素的合并,您始终可以执行以下操作:

db.test.aggregate([
{“$unwind”:“$Data”},
{“$unwind”:“$Data.description.things”},
{“$组”:{
“_id”:“$Data.name”,
“城市”:{“$first”:“$Data.city”},
“things”:{“$addToSet”:“$Data.description.things”}
}}
])
这将产生一个结果:

{
“_id”:“abc”,
“城市”:“巴黎”,
“事情”:[
{
“水果”:{
“水果名称”:“樱桃”,
“水果价格”:“3美元”
},
“花”:{
“花名”:“兰花”,
“花卉价格”:“2美元”
}
},
{
“水果”:{
“水果名称”:“苹果”,
“水果价格”:“4美元”
},
“花”:{
“花名”:“玫瑰”,
“花卉价格”:“2美元”
}
}
]
}
因此,内部的“东西”现在被“推”到一个单数数组中,同时在一个公共元素上分组并添加一些额外的字段

如果您确实想要具有更多“合并”甚至可能避免删除重复的“集合”项的内容,那么您可以使用以下语句进一步重新塑造:

db.test.aggregate([
{“$unwind”:“$Data”},
{“$unwind”:“$Data.description.things”},
{“$project”:{
“名称”:“$Data.name”,
“城市”:“$Data.city”,
“things”:“$Data.description.things”,
“类型”:{“$literal”:[“花”、“果”]}
}},
{“$unwind”:“$type”},
{“$组”:{
“_id”:“$name”,
“城市”:{“$first”:“$city”},
“things”:{“$push”:{“$cond”:[
{“$eq”:[“$type”,“flower”]},
{