我想知道如何实现标准偏差聚合函数以在 Spring Mongo Data 中使用。
我知道 Mongo DB 3.2 有一个标准偏差聚合函数,但它在 Spring Data 中不可用。
我可以使用 Mongo 的聚合功能吗?
谢谢。
我想知道如何实现标准偏差聚合函数以在 Spring Mongo Data 中使用。
我知道 Mongo DB 3.2 有一个标准偏差聚合函数,但它在 Spring Data 中不可用。
我可以使用 Mongo 的聚合功能吗?
谢谢。
"不可用"和"没有实现的辅助方法"之间有明显的区别,这就是这里的真实情况。仅仅因为没有实现$stdDevSamp
or$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"))
)
)
);
因此,即使没有“内置助手”为您制定 BSON 对象构造,您仍然可以使用功能。您只需自己进行施工。