Istnieje wyraźna różnica między „niedostępne” i „brak zaimplementowanej metody pomocniczej” , i tak jest w tym przypadku. Tylko dlatego, że nie ma „pomocnika” do implementacji $stdDevSamp
lub $stdDevPop
operatorów, nie oznacza to, że nie mogą być używane, o ile oczywiście łączysz się z instancją MongoDB 3.2.
Wszystko, czego naprawdę potrzebujesz, to niestandardowa klasa obsługująca AggregationOperation
interfejs, który pozwoli na budowę przy użyciu 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);
}
}
Następnie możesz użyć tej klasy w konstrukcji potoku agregacji, tak jak na przykład:
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"))
)
)
);
I to jest odpowiednik przykład dokumentacji :
db.users.aggregate(
[
{ "$sample": { "size": 100 } },
{ "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } }
]
)
Jako interfejs dla AggregationOperation
klasa łatwo miesza się z zaimplementowanymi pomocnikami:
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"))
)
)
);
Możesz więc nadal korzystać z funkcji, nawet jeśli nie ma „wbudowanego pomocnika”, aby opracować dla ciebie konstrukcję obiektu BSON. Po prostu sam wykonujesz konstrukcję.