sql >> Databasteknik >  >> NoSQL >> MongoDB

Använd $stdDevSamp eller $stdDevPop med Spring Mongo

Det finns en tydlig skillnad mellan "inte tillgänglig" och "ingen implementerad hjälpmetod" , och det är det verkliga fallet här. Bara för att det inte finns någon "hjälpare" för att implementera $stdDevSamp eller $stdDevPop operatörer, betyder inte att de inte kan användas, så länge du ansluter till en MongoDB 3.2-instans förstås.

Allt du egentligen behöver är en anpassad klass som stöder AggregationOperation gränssnitt, som tillåter konstruktion med 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);
    }
}

Sedan kan du använda den klassen i aggregeringspipelinekonstruktion så här:

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

Och det är motsvarigheten till dokumentationsexemplet :

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

Som ett gränssnitt för AggregationOperation klassen blandas lätt med de implementerade hjälparna:

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

Så du kan fortfarande använda funktioner även om det inte finns någon "buit in helper" för att arbeta fram BSON Object-konstruktionen åt dig. Du gör bara konstruktionen själv.




  1. Spring-Data mongodb frågar efter flera klasser lagrade i samma samling

  2. Django Channels Error - Kan inte importera BACKEND 'asgi_redis.RedisChannelLayer'

  3. Spring Redis - Läs konfigurationen från filen application.properties

  4. redis Det verkar som om servern har stängt anslutningen