1

我想知道如何实现标准偏差聚合函数以在 Spring Mongo Data 中使用。

我知道 Mongo DB 3.2 有一个标准偏差聚合函数,但它在 Spring Data 中不可用。

我可以使用 Mongo 的聚合功能吗?

谢谢。

4

1 回答 1

1

"不可用""没有实现的辅助方法"之间有明显的区别,这就是这里的真实情况。仅仅因为没有实现$stdDevSampor$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 对象构造,您仍然可以使用功能。您只需自己进行施工。

于 2016-02-25T01:03:45.660 回答