用于更改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

我有一个mongodb数据库,其结构如下

{
 "_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
写入集合,但它是一个与现有源不同的“新”集合。如果您只是“转换”一个现有的源并打算保留该集合,那么在这种情况下,循环数据并使用“批量写入”是更好的选择。但我也强烈反对您预期的输出格式,因为由于原子更新数据的限制,“嵌套数组”不是一个明智的想法。我的意图是保留集合,输出仅用于生成菜单。