以下是示例文档结构。
db.volume_statistics.insert({ "client": "SER",
"message": "Sample_v02RQ",
"GDS": "SABRE",
"daily": 240000,
"hourly": {"0": 1000, "1": 100, "2": 454, "3":3434, "4":3434, "5":343, ... , ”23”:454 },
"date":ISODate("2013-06-23T04:00:00Z") });
我正在尝试编写一个查询,按照以下输出格式将每小时列的信息按 8 小时{所有 8 小时的总和}和月份分组。
{ "Month" : 5 , "01-08" : 26970, "09-17" : 45970}
{ "Month" : 6 , "01-08" : 269712, "09-17" : 56970}
输出定义为六月{6},它在 01-08 小时内收到 269712 个请求,在 09-17 小时内收到 56970 个请求。
我编写了以下本机命令和 Java 代码来执行此操作。
本机命令::
db.volume_statistics.aggregate( { $match: { date: { $gt: ISODate("2011-01-01T00:00:00Z") } } },
{ $group : { _id: { month: { $month: "$date" } }, count: { $sum: "$hourly.0" }, count1: { $sum: "$hourly.1" } } },
{ $project: { _id: 1, count : 1 , count1 : 1 , "01-08" :{ $add:["$count", "$count1"]} } } );
Java实现::
DBObject match = new BasicDBObject("$match", new BasicDBObject("date",new BasicDBObject("$gt",fromDate)));
DBObject fields = new BasicDBObject("_id", 1);
fields.put("hourly_0", 1);
fields.put("hourly_1", 1);
fields.put("01-08", new BasicDBObject("$add","$hourly_0"));
DBObject project = new BasicDBObject("$project", fields);
// 现在 $group 操作 *
DBObject groupFields = new BasicDBObject("_id", new BasicDBObject("$month","$date"));
groupFields.put("hourly_0", new BasicDBObject("$sum", "$hourly.0"));
groupFields.put("hourly_1", new BasicDBObject("$sum", "$hourly.1"));
DBObject group = new BasicDBObject("$group", groupFields);
*
// 运行聚合
AggregationOutput output = table.aggregate(match,group,project);
几乎我已经完成了逻辑,但 $add 命令的唯一问题。如何使用 mongo-java 实现定义“$add :["$count" , "$count1"]”。我无法在 java 实现的 $add 命令中提及多个值。有人可以建议我如何完成这个吗?