sql >> Database >  >> NoSQL >> MongoDB

Hoe $cond-bewerking te gebruiken in het aggregatieraamwerk van Spring-MongoDb

Als u de huidige Spring Data-release gebruikt die ondersteuning biedt voor de $cond operator via het $project pijplijn, dan kan dit worden geconverteerd naar (niet getest):

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.*;
import org.springframework.data.mongodb.core.query.Criteria;

Cond condOperation = ConditionalOperators.when(Criteria.where("start").is("EARLY"))
                                    .thenValueOf("deltastart.start")
                                    .otherwise("deltastart.end");

Aggregation agg = newAggregation(project().and(condOperation).as("start"));
AggregationResults<MyClass> results = mongoTemplate.aggregate(agg, MyClass.class); 
List<MyClass> myList = results.getMappedResults();

Voor Spring-Data MongoDB-versies die geen ondersteuning bieden voor de $cond operator in de aggregatiebewerking, is er een tijdelijke oplossing om de AggregationOperation te implementeren interface om een ​​DBObject op te nemen:

public class CustomProjectAggregationOperation implements AggregationOperation {
    private DBObject operation;

    public CustomProjectAggregationOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

Implementeer vervolgens het $project bewerking als een DBObject in de aggregatiepijplijn die dezelfde is als degene die u heeft:

DBObject operation = (DBObject) new BasicDBObject(
    "$project", new BasicDBObject(
         "start", new BasicDBObject(
                "$cond", new Object[]{
                        new BasicDBObject(
                            "$eq", new Object[]{ "$start", "EARLY"}
                        ),
                        "$deltastart.start",
                        "$deltastart.end"
                 }
           )
     )
);

die u vervolgens kunt gebruiken in TypeAggregation:

TypedAggregation<CustomClass> aggregation = newAggregation(CustomClass.class,
    new CustomProjectAggregationOperation(operation)
);
AggregationResults<CustomClass> result = mongoTemplate.aggregate(aggregation, CustomClass.class); 


  1. Documentdatabases:overtollige gegevens, referenties, enz. (specifiek MongoDB)

  2. Django Celery kan postgres db in taak niet opvragen

  3. Detecteren of een waarde ten minste één numeriek cijfer in SQL bevat

  4. Mongoose verwijdert (pull) een document binnen een array, werkt niet met ObjectID