在spring-data-mongodb的$last聚合中返回对象



我想使用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接口。

最新更新