我有以下收藏
{
"pos": 1
"daily": 1,
"hourly": {
"15": 1,
"23": 4
}
}
每小时范围从0到23,我只想按位置分组,并希望每天和个别小时汇总($ sum)。每小时有点欺骗我。
答案 0 :(得分:0)
你可能应该使用tr
transliteration operator,聚合框架不能遍历对象的键:
db.collection.mapReduce(
function() {
var obj = { "daily": this.daily, "hourly": 0 };
var hourly = this.hourly;
hourly.forEach(function(hour) {
obj.hourly+= hourly[hour];
});
emit(null, obj);
},
function(key,values) {
var obj = { "daily": 0, "hourly": 0 };
values.forEach(function(value) {
obj.daily += value.daily;
obj.hourly += value.hourly;
});
return obj;
},
{ "out": { "inline": 1 } }
)
或者如果你的意思是你只想要“每小时”的总数,那就这样做:
db.collection.aggregate([
{ "$group": {
"_id": null,
"daily": { "$sum": "$daily" },
"0": { "$sum": "$hourly.0" },
"1": { "$sum": "$hourly.1" },
"2": { "$sum": "$hourly.2" },
"3": { "$sum": "$hourly.3" },
"4": { "$sum": "$hourly.4" },
"5": { "$sum": "$hourly.5" },
"6": { "$sum": "$hourly.6" }
}},
{ "$project": {
"daily": 1,
"hourly": {
"0": "$0",
"1": "$1",
"2": "$2",
"3": "$3",
"4": "$4",
"5": "$5",
"6": "$6"
}
}}
])
使用聚合框架执行此操作看起来非常糟糕。在这里缩短工作时间,但你应该看看基本上需要什么:
db.collection.aggregate([
{ "$group": {
"_id": null,
"daily": { "$sum": "$daily" },
"hourly": {
"$sum": { "$add": [
"$hourly.0",,
"$hourly.1",
"$hourly.2",
"$hourly.3",
"$hourly.4",
"$hourly.5",
"$hourly.6"
]}
}
}}
])
或者再一次只是总计“每小时”值,
method(getString(R.string.message));
您当然可以使用代码生成聚合管道阶段,因为它们只是数据结构。因此,可以使用mapReduce示例(循环0..23)中显示的类似方法来生成。