用于更改MongoDB中数据结构的聚合管道
我有一个mongodb数据库,其结构如下用于更改MongoDB中数据结构的聚合管道,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个mongodb数据库,其结构如下 { "_id" : ObjectId("56f1492e95136b7d113dd1c7"), "name" : "Terminal 1 Sample Port", "owl" : [ { "macId" : "443A3", "hostName" : "Old", "group" : "High Mast Lighting", "subGroup" : "Public M
{
"_id" : ObjectId("56f1492e95136b7d113dd1c7"),
"name" : "Terminal 1 Sample Port",
"owl" : [
{
"macId" : "443A3",
"hostName" : "Old",
"group" : "High Mast Lighting",
"subGroup" : "Public Marshalling Area"
},
{
"macId" : "4437",
"hostName" : "LED Mast 7",
"group" : "High Mast Lighting",
"subGroup" : "Public Marshalling Area"
},
{
"macId" : "4437190",
"hostName" : "Ground Floor",
"group" : "Terminal 1",
"subGroup" : "Ground Floor"
},
{
"macId" : "44387",
"hostName" : "LED 80mt ",
"group" : "High Mast Lighting",
"subGroup" : "Commercial Goods Area"
},
]
[
{ "name": "High Mast Lighting",
"subvalues": [{
"name": "Public Marshalling Area",
"subvalues":
[{ "id": "44373",
"name": "Old 3"
},
{ "id": "443778",
"name": "LED Light Mast 7"
}]
}]
}
]
}
我想将其转换为以下结构
{
"_id" : ObjectId("56f1492e95136b7d113dd1c7"),
"name" : "Terminal 1 Sample Port",
"owl" : [
{
"macId" : "443A3",
"hostName" : "Old",
"group" : "High Mast Lighting",
"subGroup" : "Public Marshalling Area"
},
{
"macId" : "4437",
"hostName" : "LED Mast 7",
"group" : "High Mast Lighting",
"subGroup" : "Public Marshalling Area"
},
{
"macId" : "4437190",
"hostName" : "Ground Floor",
"group" : "Terminal 1",
"subGroup" : "Ground Floor"
},
{
"macId" : "44387",
"hostName" : "LED 80mt ",
"group" : "High Mast Lighting",
"subGroup" : "Commercial Goods Area"
},
]
[
{ "name": "High Mast Lighting",
"subvalues": [{
"name": "Public Marshalling Area",
"subvalues":
[{ "id": "44373",
"name": "Old 3"
},
{ "id": "443778",
"name": "LED Light Mast 7"
}]
}]
}
]
我已经能够使用lodash实现同样的功能,但我想知道是否可以使用mongodb聚合框架实现同样的功能,您需要使用它-但是作为一个输出,您将得到您想要的:
db.a.aggregate([
{$unwind:"$owl"},
{$group: {
_id:{"name":"$owl.group", "subvaluesName":"$owl.subGroup" },
subvalues1: { $addToSet:{ "id": "$owl.macId" , "name":"$owl.hostName"}}
}},
{
$project:{
_id:0,
name:"$_id.name",
subvalues:{
name:"$_id.subvaluesName",
subvalues:"$subvalues1"
}
}}
])
输出:
要保持更改,请使用$out作为最后一个聚合阶段。是的,当然可以,不过只需通过使用
$out
阶段的中间集合即可。如果你想这样做,你可能应该向我们展示你迄今为止所做的尝试。如果你确实在“改变结构”,那么聚合并不是正确的工具。虽然您可以使用$out
写入集合,但它是一个与现有源不同的“新”集合。如果您只是“转换”一个现有的源并打算保留该集合,那么在这种情况下,循环数据并使用“批量写入”是更好的选择。但我也强烈反对您预期的输出格式,因为由于原子更新数据的限制,“嵌套数组”不是一个明智的想法。我的意图是保留集合,输出仅用于生成菜单。