1

我想使用 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 是否有任何性能损失?

4

1 回答 1

0

是的,当前 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()andproject()和所有其他辅助运算符混合。AggregationOperation

于 2015-08-06T14:16:43.573 回答