Има явна разлика между "не е налично" и "няма внедрен помощен метод" , и това е истинският случай тук. Просто защото няма „помощник“ за прилагане на $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"))
)
)
);
И това е еквивалентът на пример за документация :
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"))
)
)
);
Така че все още можете да използвате функции, дори ако няма "buit in helper", който да изработи конструкцията на BSON Object вместо вас. Вие просто правите конструкцията сами.