MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verwenden Sie $stdDevSamp oder $stdDevPop mit Spring Mongo

Es gibt einen deutlichen Unterschied zwischen "nicht verfügbar" und "keine implementierte Hilfsmethode" , und das ist hier der wahre Fall. Nur weil es keinen „Helfer“ für die Implementierung des $stdDevSamp oder $stdDevPop Operatoren bedeutet nicht, dass sie nicht verwendet werden können, solange Sie natürlich eine Verbindung zu einer MongoDB 3.2-Instanz herstellen.

Alles, was Sie wirklich brauchen, ist eine benutzerdefinierte Klasse, die AggregationOperation unterstützt Schnittstelle, die eine Konstruktion mit DBObject ermöglicht :

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

Dann können Sie diese Klasse in der Aggregations-Pipeline-Konstruktion wie folgt verwenden:

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

Und das entspricht dem Dokumentationsbeispiel :

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

Als Schnittstelle für AggregationOperation die Klasse mischt sich leicht mit den implementierten Helfern:

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

So können Sie auch dann noch Funktionen nutzen, wenn es keinen „eingebauten Helfer“ gibt, der die BSON-Objektkonstruktion für Sie ausarbeitet. Sie bauen einfach selbst.