mongodb 正在查找用于Mongo聚合查询的Java代码

62o28rlo  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(141)

有人能指导我在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中的查询在日期参数上略有不同。

kmbjn2e3

kmbjn2e31#

通常,如果您正在寻找有关如何将聚合管道直接转换为Java代码(不一定使用构建器)的建议,请查看以下答案。
我不太清楚你目前卡在哪个组件上。只是聚合管道和Java代码之间的直接转换吗?聚合管道没有给出正确的结果吗?你还没有提到一些信息,比如驱动程序版本,如果需要的话,这些信息可以帮助我们提供进一步的建议。
我还想到了其他一些可能值得一提的一般性问题:

  • 您提供的示例.aggregate()代码段没有括住管道的方括号([]),而shell中需要括住管道。
  • 当引用现有字段名时,可能需要在Java代码中为它们添加前缀$,这与在shell中的操作类似。
  • 在第一个$group阶段之后,您应该能够使用点标记法(例如"$_id.distanceMiles")访问_id字段中嵌套的值,就像您在样本聚合中一样。

根据您使用的特定驱动程序,此类文档可能有助于使用构建器。

相关问题