1

Я хотел бы знать, как реализовать агрегацию стандартного отклонения. Функция, используемая в Spring Mongo Data.

I Know Mongo DB 3.2 имеет функцию агрегации стандартного отклонения, но недоступна в данных Spring.

Могу ли я использовать функцию агрегации Mongo?

Спасибо.

ответ

1

Существует четкое различие между «не доступен» и «не реализован вспомогательный метод», и это реальный случай. Просто потому, что нет «помощника» для реализации операторов $stdDevSamp или $stdDevPop, это не значит, что они не могут использоваться, если вы, конечно, подключаетесь к экземпляру MongoDB 3.2.

Все, что вам действительно нужно, это пользовательский класс поддерживает интерфейс AggregationOperation, что позволит строительство с использованием DBObject:

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 aggregation = newAggregation(
    new CustomAggregationOperation(
     new BasicDBObject("$sample", new BasicDBObject("size",100)) 
    ), 
    new CustomAggregationOperation(
     new BasicDBObject(
      "$group", 
      new BasicDBObject("_id",null) 
       .append("ageStdDev",new BasicDBObject("$stdDevSamp","$age")) 
     ) 
    ) 
); 

И это эквивалент documentation example:

db.users.aggregate(
    [ 
     { "$sample": { "size": 100 } }, 
     { "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } } 
    ] 
) 

В качестве интерфейса для AggregationOperation класс легко смешивается с внедренными помощниками:

Aggregation aggregation = newAggregation(
    // Using the match helper for the `$match` stage 
    match(
     Criteria.where("age").gte(20).lte(50) 
    ), 
    // Mixed in with custom classes for the others 
    new CustomAggregationOperation(
     new BasicDBObject("$sample", new BasicDBObject("size",100)) 
    ), 
    new CustomAggregationOperation(
     new BasicDBObject(
      "$group", 
      new BasicDBObject("_id",null) 
       .append("ageStdDev",new BasicDBObject("$stdDevSamp","$age")) 
     ) 
    ) 
); 

Таким образом, вы все еще можете использовать функции, даже если нет «буит в помощнике» отработать строительство BSON объектов для вас. Вы сами строите строительство.

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

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