2016-12-01 2 views
1

Hier ist, wie mein Dokument wie folgt aussieht:erstellen Spring Data Aggregation Abfrage mit Projektion von Nested Array

{ 
"_id" : ObjectId("583cb6bcce047d1e68339b64"), 
"variantDetails" : [ 
    { 
     "variants" : { 
      "_" : "_" 
     }, 
     "sku" : "069563-59690" 
    }, 
    { 
     "variants" : { 
      "size" : "35" 
     }, 
     "sku" : "069563-59690-35", 
     "barcode" : "809702246941" 
    }, 
    { 
     "variants" : { 
      "size" : "36" 
     }, 
     "sku" : "069563-59690-36", 
     "barcode" : "809702246958" 
    } 
    ...... 
] } 

Und ich würde eine komplexe Aggregations Abfrage wie folgt verwenden mag:

db.getCollection('product').aggregate([ 
    { '$match': { 'variantDetails.sku': { '$in': ['069563-59690', '069563-59690-36', '069563-59690-37', '511534-01001'] } } }, 
    { '$project': {'_id': 1, 'variantDetails': 1, 'variantLength': { '$size': '$variantDetails' } } }, 
    { '$unwind': '$variantDetails' }, 
    { '$match': { 'variantDetails.sku': { '$in': ['069563-59690', '069563-59690-36', '069563-59690-37', '511534-01001'] } } }, 
    { '$match': { '$or': [ 
     {'variantLength': { '$ne': 1 }, 'variantDetails.variants._': { '$ne': '_' } }, 
     {'variantLength': 1 } 
    ] } }, 
    { '$group': { '_id': '$_id', 'variantDetails': { '$push': '$variantDetails' } } }, 
    { '$project': {'_id': 1, 'variantDetails.sku': 1, 'variantDetails.barcode': 1} } 
]) 

Und hier Code ist mein Java:

final Aggregation agg = Aggregation.newAggregation(
      Aggregation.match(Criteria.where("variantDetails.sku").in(skus)), 
      Aggregation.project("_id", "variantDetails").and("variantDetails").project("size").as("variantLength"), 
      Aggregation.unwind("variantDetails"), 
      Aggregation.match(Criteria.where("variantDetails.sku").in(skus)), 
      Aggregation.match(new Criteria().orOperator(Criteria.where("variantLength").is(1), Criteria.where("variantLength").ne(1).and("variantDetails.variants._").is("_"))), 
      Aggregation.group("_id").push("variantDetails").as("variantDetails"), 
      Aggregation.project("_id", "variantDetails.sku", "variantDetails.barcode") 
      ); 

    final AggregationResults<Product> result = this.mongo.aggregate(agg, this.mongo.getCollectionName(Product.class), Product.class); 
    return result.getMappedResults(); 

Das Problem, dass der Frühling ist übersetzen

Aggregation.project("_id", "variantDetails.sku", "variantDetails.barcode") 

Um

{ "$project" : { "_id" : 1 , "sku" : "$variantDetails.sku" , "barcode" : "$variantDetails.barcode"} 

Aber ich erwarte

{ '$project': {'_id': 1, 'variantDetails.sku': 1, 'variantDetails.barcode': 1} } 

Könnte mir jemand mitteilen, wie es richtig zu machen?

Antwort

0

Sie müssen nur die Bezeichnung als Alias ​​im Projektionsvorgang als Standard angeben, den die Feder nicht stimmt. Verwenden Frühling 1.8.5 Version

Aggregation.project("_id") 
        .and(context -> new BasicDBObject("$arrayElemAt", Arrays.asList("variantDetails.sku", 0))).as("variantDetails.sku") 
        .and(context -> new BasicDBObject("$arrayElemAt", Arrays.asList("variantDetails.barcode", 0))).as("variantDetails.barcode")); 
+0

springt dann übersetzen zu '{ "$ Projekt": { "_id": 1, "variantDetails.sku": "$ variantDetails.sku", "variantDetails.barcode":" $ variantDetails.barcode "}', die den SKU und den Barcode in einem Array wie '{" variantDetails "zurückgibt: [{" sku ": [" 069563-59690-36 "]," barcode ": ...]}' – Sean

+0

Aber genau das bekommen Sie, wenn Sie die in der mongo-Shell angegebene Abfrage ausführen. Es ist ein Array und die Ausgabe zeigt das. Ich weiß nicht, was mir hier fehlt – Veeram

+0

Noop. Wenn ich die Abfrage in der Mongo-Shell ausführe, gibt sie "variantDetails" zurück: [{"sku": "069563-59690-36", "barcode": ...]} statt [{"sku": ["069563- 59690-36 "]," Barcode ": ...]}. Der SKU ist ein einzelner Wert, kein Array. – Sean

Verwandte Themen