有人能指导我在Java中进行以下Mongo查询的聚合查询吗?我试图总结车辆每天行驶的距离。有一些重复的记录(我无法删除),所以我必须使用group by过滤掉它们。
db.collection1.aggregate({ $match: { "vehicleId": "ABCDEFGH", $and: [{ "timestamp": { $gt: ISODate("2022-08-24T00:00:00.000+0000") } }, { "timestamp": { $lt: ISODate("2022-08-25T00:00:00.000+0000") } }, { "distanceMiles": { "$gt": 0 } }] } }, { $group: {"_id": {vehicleId: "$vehicleId", "distanceMiles" : "$distanceMiles" } } }, { $group: { _id: null, distance: { $sum: "$_id.distanceMiles" } } })
如果可能的话,你也可以建议一些参考资料吗?我被困在最后一组涉及$_id
部分。
除了最后一个group by之外,我所拥有的Java代码是:
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("timestamp").gte(start).lte(end),
Criteria.where("vehicleId").in(vehicleIdList));
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),
Aggregation.sort(Direction.DESC, "timestamp"),
Aggregation.project("distanceMiles", "vehicleId", "timestamp").and("timestamp")
.dateAsFormattedString("%Y-%m-%d").as("yearMonthDay"),
Aggregation.group("vehicleId", "yearMonthDay").first("vehicleId").as("vehicleId").
first("timestamp").as("lastReported").sum("distanceMiles").as("distanceMiles"));
注意:原始mongo查询和Java中的查询在日期参数上略有不同。
1条答案
按热度按时间kmbjn2e31#
通常,如果您正在寻找有关如何将聚合管道直接转换为Java代码(不一定使用构建器)的建议,请查看以下答案。
我不太清楚你目前卡在哪个组件上。只是聚合管道和Java代码之间的直接转换吗?聚合管道没有给出正确的结果吗?你还没有提到一些信息,比如驱动程序版本,如果需要的话,这些信息可以帮助我们提供进一步的建议。
我还想到了其他一些可能值得一提的一般性问题:
.aggregate()
代码段没有括住管道的方括号([
和]
),而shell中需要括住管道。$
,这与在shell中的操作类似。$group
阶段之后,您应该能够使用点标记法(例如"$_id.distanceMiles"
)访问_id
字段中嵌套的值,就像您在样本聚合中一样。根据您使用的特定驱动程序,此类文档可能有助于使用构建器。