使用spring数据mongodb进行组聚合

时间:2018-05-18 07:07:00

标签: java mongodb spring-boot spring-data-mongodb

我尝试使用日期对象中的年份值作为键来编写组聚合查询,但由于某种原因,我得到了此异常。

org.springframework.data.mapping.PropertyReferenceException: No property year(invoiceDate)

以下是我试图复制的mongo查询:

db.collection.aggregate([
   {
     $match:
     {
       "status": "Active"
     }
   },
   {
     $group:
     {
      "_id":{$year:"$invoiceDate"}
     }
  },
  {
    $sort:
    {
      "_id" : -1
    }
  }
])

这是我的Java实现:

Aggregation aggregation = Aggregation.newAggregation(
    match(new Criteria().andOperator(criteria())),
    Aggregation.group("year(invoiceDate)")
).withOptions(newAggregationOptions().allowDiskUse(true).build());

我也找不到如何对分组结果进行排序的方法。

1 个答案:

答案 0 :(得分:1)

您基本上正在寻找使用MongoDB映射到$year运算符的extractYear()

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(new Criteria().andOperator(criteria())),
    Aggregation.project().and("invoiceDate").extractYear().as("_id"),
    Aggregation.group("_id"),
    Aggregation.sort(Sort.Direction.DESC, "_id)
)

这通常需要进入$project才能让帮助者满意。

如果您真的想要$group中的表达式,那么您可以添加自定义操作表达式:

Aggregation aggregation = Aggregation.newAggregation(
  Aggregation.match(new Criteria().andOperator(criteria())),
  new AggregationOperation() {
    @Override
    public Document toDocument(AggregationOperationContext aggregationOperationContext) {
      return new Document("$group",
        new Document("_id", new Document("$year","$invoiceDate") )
      );
    }
  },
  Aggregation.sort(Sort.Direction.DESC, "_id)
)