首页 > 解决方案 > ProjectionOperation plus和previousOperation聚合mongodb java

问题描述

Aggregation aggregation = newAggregation(
     match(Criteria.where("moment").gte(from).lte(to)),
     project("pass", "carrier", "route", "iso").and("iso").as("country")
             .and("$moment").plus(14400000).as("shifted"),
             project("shifted").and(DateOperators.DayOfMonth.dayOfMonth("$moment")).previousOperation(),
             .andExpression("$moment").dateAsFormattedString("%Y-%m-%d").as("date"),
     group("pass", "carrier", "route", "country","date").count().as("total"),
     sort(Sort.Direction.DESC, "pass","total")
).withOptions(newAggregationOptions().
     allowDiskUse(true).build());

我正在尝试在控制台中工作的java(mongodb和spring boot)中执行此查询(底部工作正常),但我未能将已经转移的正确日期(称为转移)传递给DateOperators.DayOfMonth。我得到投影字段不能为空,所以我认为我使用了错误的 previousOperation()。我应该如何正确使用这个previousOperation?或者我怎样才能正确地改变我需要的日期?非常感谢你。

db.billing.aggregate(
[  
    {
        $match: { "moment": { "$gte": ISODate("2020-11-29T00:00:00Z"), "$lt": ISODate("2020-11-29T23:59:59Z")}}
       
    },
    {
        $project: { "pass" :1, "carrier": 1, "moment" :  { $subtract: ["$moment", 14400000 ] } }
    },
    {
        $group: { "_id": {"pass": "$pass","carrier": "$carrier", "day": { "$dayOfMonth": "$moment"},"total": { "$sum": 1 }}}
       
    },  
    {
        $sort: {"_id.day":1}
       
    }
   
]

)

标签: springmongodbspring-bootaggregationprojection

解决方案


推荐阅读