2017-12-26 3 views
4

Ich habe eine Mongo-Abfrage, die zum Abwickeln von vier Arrays von Objekten und Filtern der Daten auf der Grundlage der übereinstimmenden Kriterien verwendet wird. Wie führe ich den gleichen Vorgang im Frühjahr Daten mongodbMehrere Aggregation und Unwind - Spring-Daten Mongodb

Ich habe mit einzelnen Abwickler gearbeitet, aber konnte nicht mit mehreren Abwickel-und Match-Betrieb zu finden.

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' } } 
]) 

Antwort

1

Sie können unten Aggregation in 1.10.x Frühjahr Mongo-Version versuchen.

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(); 

generiert Shell Abfrage:

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

Bei statischen Einfuhren

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

Hat die Antwort für Sie arbeiten? – Veeram