我尝试使用日期对象中的年份值作为键来编写组聚合查询,但由于某种原因,我得到了此异常。
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());
我也找不到如何对分组结果进行排序的方法。
答案 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)
)