MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Utilisez $stdDevSamp ou $stdDevPop avec Spring Mongo

Il y a une nette différence entre "non disponible" et "aucune méthode d'assistance implémentée" , et c'est le cas réel ici. Tout simplement parce qu'il n'y a pas "d'aide" pour implémenter le $stdDevSamp ou $stdDevPop opérateurs, ne signifie pas qu'ils ne peuvent pas être utilisés, tant que vous vous connectez à une instance MongoDB 3.2 bien sûr.

Tout ce dont vous avez vraiment besoin est une classe personnalisée prenant en charge AggregationOperation interface, qui permettra la construction en utilisant 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);
    }
}

Ensuite, vous pouvez utiliser cette classe dans la construction du pipeline d'agrégation comme suit :

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"))
        )
    )
);

Et c'est l'équivalent de l'exemple de documentation :

db.users.aggregate(
   [
      { "$sample": { "size": 100 } },
      { "$group": { "_id": null, "ageStdDev": { "$stdDevSamp": "$age" } } }
   ]
)

En tant qu'interface pour AggregationOperation la classe se mélange facilement avec les helpers implémentés :

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"))
        )
    )
);

Ainsi, vous pouvez toujours utiliser des fonctionnalités même s'il n'y a pas d'"assistant intégré" pour élaborer la construction de l'objet BSON pour vous. Vous faites juste la construction vous-même.