MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Use $stdDevSamp ou $stdDevPop com Spring Mongo


Há uma diferença distinta entre "não disponível" e "nenhum método auxiliar implementado" , e esse é o caso real aqui. Só porque não existe um "auxiliar" para implementar o $stdDevSamp ou $stdDevPop operadores, não significa que eles não podem ser usados, desde que você esteja se conectando a uma instância do MongoDB 3.2, é claro.

Tudo o que você realmente precisa é de uma classe personalizada que suporte a AggregationOperation interface, que permitirá a construção usando 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);
    }
}

Então você pode usar essa classe na construção do pipeline de agregação da seguinte forma:
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"))
        )
    )
);

E isso é o equivalente ao exemplo de documentação :
db.users.aggregate(
   [
      { "$sample": { "size": 100 } },
      { "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } }
   ]
)

Como uma interface para AggregationOperation a classe se mistura facilmente com os auxiliares implementados:
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"))
        )
    )
);

Portanto, você ainda pode usar recursos mesmo se não houver um "ajudante embutido" para elaborar a construção do objeto BSON para você. Você mesmo faz a construção.