1)您可以通过使用类似下面通过聚合管道重建对象:
db.messurements.aggregate([
{$project: {
year : 1,
id : 1,
dataType : 1,
data: [
{ day: { $literal: 1 }, values : "$data.1"},
{ day: { $literal: 365 }, values : "$data.365"}
]}
}
]);
这将导致下面的输出:
{
"_id" : ObjectId("58416371cf34fc678d4f161c"),
"year" : 2042,
"id" : 42,
"dataType" : "something",
"data" : [
{
"day" : 1,
"values" : {
"1" : [
240,
210
],
"2" : [
230,
220
],
"24" : [
220,
130
]
}
},
{
"day" : 365,
"values" : {
"1" : [
140,
110
],
"2" : [
130,
120
],
"24" : [
120,
130
]
}
}
]
}
2)它的不漂亮,但以下汇总查询会给出预期结果:
db.messurements.aggregate([
{$project: {
year : 1,
id : 1,
dataType : 1,
data: [
{ day: { $literal: 1 }, values : "$data.1"},
{ day: { $literal: 365 }, values : "$data.365"}
]}},
{$unwind: "$data"},
{$project: {
year : 1,
id : 1,
dataType : 1,
data: [
{ day: "$data.day", hour: { $literal: 1 }, values : "$data.values.1"},
{ day: "$data.day", hour: { $literal: 2 }, values : "$data.values.2"},
{ day: "$data.day", hour: { $literal: 24 }, values : "$data.values.24"}
]}},
{$unwind: "$data"},
{$project: {
year : 1,
day: "$data.day",
hour: "$data.hour",
id : 1,
dataType : 1,
values: "$data.values"
}},
{$unwind: "$values"},
{$group: {
_id: {
year: "$year",
day :"$day",
hour: "$hour"},
data: {$first: "$values"}
}},
{$group: {
_id: "",
data: { $push : "$data" }
}}
]);
将输出:
{ "_id" : "", "data" : [ 120, 130, 140, 220, 230, 240 ] }
3) 我觉得MongoDB的网站,你可以用数据操作做什么非常机智,见 - https://docs.mongodb.com/v3.2/reference/operator/aggregation/
使用'mapReduce' – styvane
嗨Styvane,我会用凯文回答,但本周晚些时候我会仔细看看mapReduce。 TY :-) –