यदि वर्तमान स्प्रिंग डेटा रिलीज़ का उपयोग कर रहे हैं जिसमें $cond
. के लिए समर्थन है $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();
स्प्रिंग-डेटा MongoDB संस्करण के लिए जिसमें $cond
. के लिए समर्थन नहीं है एग्रीगेशन ऑपरेशन में ऑपरेटर, एक वर्कअराउंड है जो एग्रीगेशनऑपरेशन को लागू करना है एक 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);