多个聚合和展开 – Spring数据Mongodb

前端之家收集整理的这篇文章主要介绍了多个聚合和展开 – Spring数据Mongodb前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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();

生成的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","generatorCode").
       andInclude(bind("eCId","eCList.eCId")).
       andInclude(bind("eCCode","eCList.eCCode")).
       andInclude(bind("eCKey","eCList.eCKey"))
);

猜你在找的设计模式相关文章