MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak korzystać z operacji $cond w ramach agregacji Spring-MongoDb?

Jeśli używasz aktualnej wersji Spring Data, która obsługuje $cond operator za pośrednictwem $project potok, to można to przekonwertować na (nietestowane):

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

Dla wersji Spring-Data MongoDB, która nie obsługuje $cond operatora w operacji agregacji, istnieje obejście polegające na zaimplementowaniu AggregationOperation interfejs do przyjęcia DBObject:

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

Następnie zaimplementuj $project operacja jako DBObject w potoku agregacji, który jest taki sam jak ten, który masz:

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

których możesz następnie użyć w TypeAggregation:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zapytanie MongoDB za pomocą $i i wielu $lub

  2. MongoDB przejmuje mLab  —  Jakie są różne alternatywy hostingu MongoDB?

  3. Jak wypada porównanie danych Morphia, Mongo4j i Spring dla MongoDB?

  4. Jak mogę użyć Pythona do przekształcenia bsondump MongoDB w JSON?

  5. Co mam wybrać:MongoDB/Cassandra/Redis/CouchDB?