1

Я хотел бы реализовать следующий запрос с использованием пружинного данных-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 несколько раз в одном агрегате?

ответ

0

Да, это не допускается конструкциями нынешних помощников агрегатора весны-монго. Но вы можете создать свой собственный «обычай» операция агрегации объект, а затем использовать его в трубопроводе:

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 конструктор чтобы сформировать этот этап трубопровода так, как вы хотите. Этот hapilly смешивается с group() и project() и всеми другими вспомогательными операторами, так как он реализует интерфейс AggregationOperation.

 Смежные вопросы

  • Нет связанных вопросов^_^