Có sự khác biệt rõ ràng giữa "không có sẵn" và "không có phương pháp trình trợ giúp nào được triển khai" , và đó là trường hợp thực tế ở đây. Chỉ vì không có "người trợ giúp" để triển khai $stdDevSamp
hoặc $stdDevPop
không có nghĩa là chúng không thể được sử dụng, miễn là bạn đang kết nối với phiên bản MongoDB 3.2.
Tất cả những gì bạn thực sự cần là một lớp tùy chỉnh hỗ trợ AggregationOperation
giao diện, điều đó sẽ cho phép xây dựng bằng 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);
}
}
Sau đó, bạn có thể sử dụng lớp đó trong xây dựng đường ống tổng hợp như sau:
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"))
)
)
);
Và điều đó tương đương với ví dụ về tài liệu :
db.users.aggregate(
[
{ "$sample": { "size": 100 } },
{ "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } }
]
)
Làm giao diện cho AggregationOperation
lớp dễ dàng kết hợp với các trình trợ giúp được triển khai:
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"))
)
)
);
Vì vậy, bạn vẫn có thể sử dụng các tính năng ngay cả khi không có "buit in helper" để tìm ra cấu trúc BSON Object cho bạn. Bạn chỉ cần tự xây dựng.