Mezi „není k dispozici“ je výrazný rozdíl a "žádná implementovaná pomocná metoda" , a to je skutečný případ. Jen proto, že neexistuje žádný „pomocník“ pro implementaci $stdDevSamp
nebo $stdDevPop
operátory, neznamená, že je nelze použít, pokud se samozřejmě připojujete k instanci MongoDB 3.2.
Vše, co opravdu potřebujete, je vlastní třída podporující AggregationOperation
rozhraní, které umožní konstrukci pomocí 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);
}
}
Potom můžete tuto třídu použít při konstrukci agregačního potrubí takto:
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"))
)
)
);
A to je ekvivalent příkladu dokumentace :
db.users.aggregate(
[
{ "$sample": { "size": 100 } },
{ "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } }
]
)
Jako rozhraní pro AggregationOperation
třída se snadno mísí s implementovanými pomocníky:
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"))
)
)
);
Takže můžete stále používat funkce, i když není k dispozici žádný „vestavěný pomocník“, který by za vás vypracoval konstrukci objektu BSON. Stavbu si uděláte sami.