如何打开 mongodb 具有未知字段名称的嵌套文档
How to unwrap a mongodb nested document with unknown field names
我有一些来自 IoT 设备的数据,我使用以下结构将其存储在 mongodb 中:
{
data:{
<timeStamp1>:<energyValue1>,
<timeStamp2>:<energyValue2>,
<timeStamp3>:<energyValue3>,...
}
}
例如:
{
"data":{
"1648310504":51,
"1648310404":25,
"1648310304":63
}
}
有没有办法在聚合管道中将此文档解包为多个文档,以便该阶段的输出看起来像这样
文档 1。
{
“时间戳”:1648310504,
“数据”:51
}
文档 2。
{
“时间戳”:1648310404,
“数据”:25
}
文档 3。
{
“时间戳”:1648310304,
“数据”:63
}
也许是这样的:
db.collection.aggregate([
{
"$addFields": {
"data": {
"$objectToArray": "$data"
}
}
},
{
$unwind: "$data"
},
{
$project: {
timestamp: "$data.k",
data: "$data.v",
_id: 0
}
}
])
解释:
- 将对象数据转换为包含元素 key->k , value->v 的数组
- 展开数组数据,使其分解为单个文档。
- 按预期将数据 sub-fileds 投影到时间戳和数据。
我有一些来自 IoT 设备的数据,我使用以下结构将其存储在 mongodb 中:
{
data:{
<timeStamp1>:<energyValue1>,
<timeStamp2>:<energyValue2>,
<timeStamp3>:<energyValue3>,...
}
}
例如:
{
"data":{
"1648310504":51,
"1648310404":25,
"1648310304":63
}
}
有没有办法在聚合管道中将此文档解包为多个文档,以便该阶段的输出看起来像这样
文档 1。 { “时间戳”:1648310504, “数据”:51 }
文档 2。 { “时间戳”:1648310404, “数据”:25 }
文档 3。 { “时间戳”:1648310304, “数据”:63 }
也许是这样的:
db.collection.aggregate([
{
"$addFields": {
"data": {
"$objectToArray": "$data"
}
}
},
{
$unwind: "$data"
},
{
$project: {
timestamp: "$data.k",
data: "$data.v",
_id: 0
}
}
])
解释:
- 将对象数据转换为包含元素 key->k , value->v 的数组
- 展开数组数据,使其分解为单个文档。
- 按预期将数据 sub-fileds 投影到时间戳和数据。