我有一个mongo查询,用于展开四个对象数组并根据匹配条件过滤数据.我如何在 Spring数据mongodb中执行相同的操作 我曾经使用单一展开,但找不到任何多次展开和匹配操作. db.generator.aggrega
我曾经使用单一展开,但找不到任何多次展开和匹配操作.
db.generator.aggregate([ { $unwind :'$eCList'}, { $unwind :'$pcList'}, { $unwind :'$cityList'}, { $unwind :'$eATypeList'}, { $match : {'eCList.eCCode': { $eq : 'enccode1'} }}, { $match : {'pcList.pcCode': { $eq : 'pccode1'} }}, { $match : {'cityList.cityCode': { $eq : 'citycode1'} }}, { $match : {'eATypeList.eATypeCode': { $eq : 'eATypeCode1'} }}, { $project : {generatorData : '$generatorData',pcList:'$pcList', generatorCode: '$generatorCode', eCId : '$eCList.eCId', eCCode : '$eCList.eCCode', eCKey : '$eCList.eCKey' } } ])您可以在1.10.x spring mongo版本中尝试以下聚合.
Aggregation aggregation = Aggregation.newAggregation( Aggregation.unwind("eCList"), Aggregation.unwind("pcList"), Aggregation.unwind("cityList"), Aggregation.unwind("eATypeList"), Aggregation.match(Criteria.where("eCList.eCCode").is("enccode1")), Aggregation.match(Criteria.where("pcList.pcCode").is("pccode1")), Aggregation.match(Criteria.where("cityList.cityCode").is("citycode1")), Aggregation.match(Criteria.where("eATypeList.eATypeCode").is("eATypeCode1")), Aggregation.project("generatorData", "pcList", "generatorCode"). andInclude(Aggregation.bind("eCId", "eCList.eCId")). andInclude(Aggregation.bind("eCCode", "eCList.eCCode")). andInclude(Aggregation.bind("eCKey", "eCList.eCKey")) ); List<BasicDBObject> results = mongoTemplate.aggregate( aggregation, "generator", BasicDBObject.class).getMappedResults();
生成的Shell查询:
{ "aggregate":"__collection__", "pipeline":[ {"$unwind":"$eCList"}, {"$unwind":"$pcList"}, {"$unwind":"$cityList"}, {"$unwind":"$eATypeList"}, {"$match":{"eCList.eCCode":"enccode1"}}, {"$match":{"pcList.pcCode":"pccode1"}}, {"$match":{"cityList.cityCode":"citycode1"}}, {"$match":{"eATypeList.eATypeCode":"eATypeCode1"}}, {"$project":{ "generatorData":1, "pcList":1, "generatorCode":1, "eCId":"$eCList.eCId", "eCCode":"$eCList.eCCode", "eCKey":"$eCList.eCKey"}} ] }
使用静态导入
import org.springframework.data.mongodb.core.query.Criteria; import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; Aggregation aggregation = newAggregation( unwind("eCList"), unwind("pcList"), unwind("cityList"), unwind("eATypeList"), match(where("eCList.eCCode").is("enccode1")), match(where("pcList.pcCode").is("pccode1")), match(where("cityList.cityCode").is("citycode1")), match(where("eATypeList.eATypeCode").is("eATypeCode1")), project("generatorData", "pcList", "generatorCode"). andInclude(bind("eCId", "eCList.eCId")). andInclude(bind("eCCode", "eCList.eCCode")). andInclude(bind("eCKey", "eCList.eCKey")) );