sql >> データベース >  >> NoSQL >> MongoDB

Spring-MongoDb集約フレームワークで$cond操作を使用する方法

    $condをサポートする現在のSpringDataリリースを使用している場合 $projectを介したオペレーター パイプラインの場合、これは(テストされていない)に変換できます:

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

    $condをサポートしていないSpring-DataMongoDBバージョンの場合 集計操作の演算子には、 AggregationOperationを実装するための回避策があります。 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);
        }
    }
    

    次に、$projectを実装します あなたが持っているものと同じ集約パイプラインのDBObjectとしての操作:

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

    これをTypeAggregationで使用できます:

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


    1. Mongodbアグリゲーションパイプライングループプッシュを制限する方法

    2. MongoDBノードドライバーがインスタンスプールを生成してエラーを破棄するのはなぜですか?

    3. $match内のmongodb集計クエリで$regexを使用する方法

    4. ComputeEngineの内部IPでRedisに接続するとGoogleCloud関数がタイムアウトします