sql >> Databáze >  >> NoSQL >> MongoDB

Použijte $stdDevSamp nebo $stdDevPop s Spring Mongo

Mezi „není k dispozici“ je výrazný rozdíl a "žádná implementovaná pomocná metoda" , a to je skutečný případ. Jen proto, že neexistuje žádný „pomocník“ pro implementaci $stdDevSamp nebo $stdDevPop operátory, neznamená, že je nelze použít, pokud se samozřejmě připojujete k instanci MongoDB 3.2.

Vše, co opravdu potřebujete, je vlastní třída podporující AggregationOperation rozhraní, které umožní konstrukci pomocí 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);
    }
}

Potom můžete tuto třídu použít při konstrukci agregačního potrubí takto:

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

A to je ekvivalent příkladu dokumentace :

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

Jako rozhraní pro AggregationOperation třída se snadno mísí s implementovanými pomocníky:

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

Takže můžete stále používat funkce, i když není k dispozici žádný „vestavěný pomocník“, který by za vás vypracoval konstrukci objektu BSON. Stavbu si uděláte sami.




  1. Jak nastavit objem dat docker mongo

  2. Vyplatí se zkrácení názvů vlastností MongoDB?

  3. Nelze načíst data z API pomocí Express NodeJS a MongoDB, načítání

  4. Využití vyrovnávací paměti ve fázi řazení přetečení překračuje interní limit