Multiple aggregation and unwinding - Spring Mongodb data

I have a mongo query that is used to expand four arrays of objects and filter data based on matching criteria. How to perform the same operation in Spring data mongodb

I worked with a single unwind, but could not find a single one with several unwinding and matching operations.

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' } }
])
+4
source share
1 answer

You can try aggregation in version 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();

Generated shell request:

{
  "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"}}
  ]
}

With static import

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"))
);
+1
source

Source: https://habr.com/ru/post/1691340/


All Articles