重组文件:这可能吗?

时间:2018-09-24 07:01:34

标签: mongodb

说我有一个看起来像这样的收藏集:

{
   "_id":  ObjectId(...),
   "recorded": ISODate("2018-05-05T11:05:32.000"),
   "devices": [
       {
           "id": "KSA2",
           "temp": 32,
           "ttl": 10
       },
       {
           "id": "KSA24",
           "temp": 28,
           "ttl": 10
       }       
   ]  
}
{
   "_id":  ObjectId(...),
   "recorded": ISODate("2018-05-05T18:23:45.000"),
   "devices": [
       {
           "id": "KSA2",
           "temp": 31,
           "ttl": 10
       },
       {
           "id": "KSA24",
           "temp": 16,
           "ttl": 10
       }       
   ]  
}

我需要做的是通过设备将其转换为文档:

{
    "Devices": [
        {
            "id": "KSA2",
            "observations": [
                {
                    "time":ISODate("2018-05-05T11:05:32.000"),
                    "temp":32,
                    "ttl":10
                }
                {
                    "time":ISODate("2018-05-05T18:23:45.000"),
                    "temp":31,
                    "ttl":10
                }
            ]


        },
        {
            "id":"KSA24",
            ...
        }
    ]
}

这是否有可能使用聚合框架在mongodb内进行,还是需要在外部使用Python或类似的工具进行?

1 个答案:

答案 0 :(得分:0)

对您的收藏集运行以下汇总:

db['myCollection'].aggregate(
    [
        {
            $unwind: {
                path : "$devices",

            }
        },
        {
            $group: {
            _id : "$devices.id",
            observations : {$push : 
              {
                time : "$recorded",
                temp:"$devices.temp",
                ttl:"$devices.ttl"}
              }
            }
        },
        {
            $out: "devices"
        },
    ],
);

使用的阶段:

  • $unwind:每个设备元素创建一个文档。
  • $group:按设备ID分组,将自定义子文档推送到bservation数组。
  • $out:将结果输出到一个新的集合中,这里是“设备”。

这将在设备集合中输出:

db['devices'].find();
{ 
    "_id" : "KSA24", 
    "observations" : [
        {
            "time" : ISODate("2018-05-05T13:05:32.000+0200"), 
            "temp" : 28.0, 
            "ttl" : 10.0
        }, 
        {
            "time" : ISODate("2018-05-05T20:23:45.000+0200"), 
            "temp" : 16.0, 
            "ttl" : 10.0
        }
    ]
}
{ 
    "_id" : "KSA2", 
    "observations" : [
        {
            "time" : ISODate("2018-05-05T13:05:32.000+0200"), 
            "temp" : 32.0, 
            "ttl" : 10.0
        }, 
        {
            "time" : ISODate("2018-05-05T20:23:45.000+0200"), 
            "temp" : 31.0, 
            "ttl" : 10.0
        }
    ]
}

之后,使用新设备集合,或将其重命名为您的旧名称。