说我有一个看起来像这样的收藏集:
{
"_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或类似的工具进行?
答案 0 :(得分:0)
对您的收藏集运行以下汇总:
db['myCollection'].aggregate(
[
{
$unwind: {
path : "$devices",
}
},
{
$group: {
_id : "$devices.id",
observations : {$push :
{
time : "$recorded",
temp:"$devices.temp",
ttl:"$devices.ttl"}
}
}
},
{
$out: "devices"
},
],
);
使用的阶段:
这将在设备集合中输出:
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
}
]
}
之后,使用新设备集合,或将其重命名为您的旧名称。