我想使用spring-data-mongodb实现以下查询:
db.getCollection('collection').aggregate([
{ $group: {_id: "$profile", last: { $last: { firstname:"$firstname", lastname:"$lastname"}}}}])
导致如下结果:
{
"_id": "",
"last": {
"firstname": "",
"lastname": ""
}
}
然而,似乎唯一可用的API是
GroupOperation groupOperation = Aggregation.group("profile").last("firstname").as("firstname").last("lastname").as("lastname");
转换成:
db.getCollection('collection').aggregate([
{ $group: {_id: "$profile", firstname: { $last: "$firstname"}, lastname: { $last: "$lastname"}}}])
给:{
"_id": "",
"firstname": "",
"lastname": ""
}
有GroupOperation.last(AggregationExpression expr)
,但我不知道如何使用它。
另一方面,在一个聚合中多次使用$last是否有性能损失?
是的,当前spring mongo聚合助手的构造不允许这样做。但是您可以构造自己的"自定义"聚合操作对象,然后在管道中使用它:
public class CustomAggregationOperation implements AggregationOperation {
private DBObject operation;
public CustomAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
这里的用法是:
Aggregation agg = newAggregation(
new CustomAggregationOperation(
new BasicDBObject("$group",
new BasicDBObject("last",
new BasicDBObject("$last",
new BasicDBObject("fisrname","$firstname")
.append("lastname","$lastname")
)
)
)
)
);
因此,您可以使用BSON对象构造函数来按照您想要的方式塑造管道阶段。这与group()
和project()
以及所有其他帮助操作符愉快地混合在一起,因为它实现了AggregationOperation
接口。