Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring数据mongodb的组聚合_Java_Mongodb_Spring Boot_Spring Data Mongodb - Fatal编程技术网

Java 使用spring数据mongodb的组聚合

Java 使用spring数据mongodb的组聚合,java,mongodb,spring-boot,spring-data-mongodb,Java,Mongodb,Spring Boot,Spring Data Mongodb,我试图使用date对象中的year值作为键来编写组聚合查询,但由于某种原因,我得到了这个异常 org.springframework.data.mapping.PropertyReferenceException: No property year(invoiceDate) 下面是我尝试复制的mongo查询: db.collection.aggregate([ { $match: { "status": "Active" } },

我试图使用date对象中的year值作为键来编写组聚合查询,但由于某种原因,我得到了这个异常

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());

我也没有找到一种方法来对分组结果应用排序。

您基本上是在寻找映射到MongoDB运算符的
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)
)
这通常需要进入一个阶段,以使助手感到高兴

如果确实希望表达式位于中,则可以添加自定义操作表达式:

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)
)

Aggregation.sort()
-为什么要调用它呢?我认为您需要在sort方法中提供一个引用,但您可能是对的。您知道SpEL表达式失败的原因吗?
Aggregation.sort()
不起作用,我得到了
您必须提供至少一个属性进行排序对不起,这只是一个简短的评论,而我正在走开一段时间,并打算更多地作为一个“提示”来选择方法和发现选项。在下面添加了实际的管道翻译。在提供的答案中是否有您认为无法解决您的问题的内容?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题