Der er en tydelig forskel mellem "ikke tilgængelig" og "ingen implementeret hjælpemetode" , og det er det virkelige tilfælde her. Bare fordi der ikke er nogen "hjælper" til at implementere $stdDevSamp
eller $stdDevPop
operatører, betyder ikke, at de ikke kan bruges, så længe du opretter forbindelse til en MongoDB 3.2-instans, selvfølgelig.
Alt du virkelig behøver er en tilpasset klasse, der understøtter AggregationOperation
grænseflade, der tillader konstruktion ved hjælp af 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);
}
}
Så kan du bruge den klasse i aggregeringsrørledningskonstruktion som sådan:
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"))
)
)
);
Og det svarer til dokumentationseksemplet :
db.users.aggregate(
[
{ "$sample": { "size": 100 } },
{ "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } }
]
)
Som en grænseflade til AggregationOperation
klassen blandes let med de implementerede hjælpere:
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"))
)
)
);
Så du kan stadig bruge funktioner, selvom der ikke er nogen "buit in helper" til at udarbejde BSON Object-konstruktionen for dig. Du laver bare konstruktionen selv.