MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Usa $stdDevSamp o $stdDevPop con Spring Mongo

C'è una netta differenza tra "non disponibile" e "nessun metodo di supporto implementato" , e questo è il caso reale qui. Solo perché non esiste un "helper" per l'implementazione di $stdDevSamp o $stdDevPop operatori, non significa che non possano essere utilizzati, a patto che tu ti connetta a un'istanza MongoDB 3.2 ovviamente.

Tutto ciò di cui hai veramente bisogno è una classe personalizzata che supporti AggregationOperation interfaccia, che consentirà la costruzione utilizzando 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);
    }
}

Quindi puoi utilizzare quella classe nella costruzione di pipeline di aggregazione in questo modo:

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

E questo è l'equivalente dell'esempio di documentazione :

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

Come interfaccia per AggregationOperation la classe si mescola facilmente con gli helper implementati:

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

Quindi puoi ancora utilizzare le funzionalità anche se non esiste un "helper integrato" per elaborare la costruzione dell'oggetto BSON per te. Devi solo fare la costruzione da solo.