sql >> Database >  >> NoSQL >> MongoDB

Gebruik $stdDevSamp of $stdDevPop met Spring Mongo

Er is een duidelijk verschil tussen "niet beschikbaar" en "geen geïmplementeerde hulpmethode" , en dat is hier het echte geval. Gewoon omdat er geen "helper" is voor het implementeren van de $stdDevSamp of $stdDevPop operators, betekent niet dat ze niet kunnen worden gebruikt, zolang je natuurlijk verbinding maakt met een MongoDB 3.2-instantie.

Het enige dat u echt nodig hebt, is een aangepaste klasse die de AggregationOperation ondersteunt interface, die constructie mogelijk maakt met behulp van 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);
    }
}

Dan kunt u die klasse als volgt gebruiken in de aggregatiepijplijnconstructie:

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

En dat is het equivalent van het documentatievoorbeeld :

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

Als interface voor AggregationOperation de klas mengt zich gemakkelijk met de geïmplementeerde helpers:

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

U kunt dus nog steeds functies gebruiken, zelfs als er geen "ingebouwde helper" is om de BSON Object-constructie voor u uit te werken. De constructie doe je gewoon zelf.




  1. Geen toegang tot verzameling vanuit de shell - SyntaxError:missing; voor statement (shell)::1

  2. Meerdere Mongodb-databases gebruiken met Meteor.js

  3. Willekeurige, schemaloze gegevens in HTML weergeven met node.js / mongodb

  4. Redis-schildwacht versus clustering