我有一个mongo查询,用于展开四个对象数组并根据匹配条件过滤数据.我如何在
Spring数据mongodb中执行相同的操作
我曾经使用单一展开,但找不到任何多次展开和匹配操作.
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();
{ "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","generatorCode"). andInclude(bind("eCId","eCList.eCId")). andInclude(bind("eCCode","eCList.eCCode")). andInclude(bind("eCKey","eCList.eCKey")) );