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.