2017-01-09 3 views
1

Ich habe diese mongodb Abfrage

db.getCollection('myCollection').aggregate(
    [{ 
     $project: { 
      length: { 
       $strLenCP: "$prefix" 
      } 
     } 
    }, { 
     $sort: { 
      length: -1 
     } 
    }] 
) 

, die ich in eine Quelle Java-Projekt verwenden möchten, aber ich kann nicht die richtige Java-Code zu schreiben, verwalten (die Art ist nicht die Problem).

ich versucht, dieses

Aggregation agg = newAggregation(project().andExpression("strLenCP(prefix)").as("prefixLength")); 
AggregationResults <RequestSettingsWithPrefixLength> results = mongoTemplate.aggregate(agg, RequestSettings.class, RequestSettingsWithPrefixLength.class); 
List <RequestSettingsWithPrefixLength> requestSettingsList = results.getMappedResults(); 

aber ich bin eine Null-Schlüssel in agg JSON (Debug-Modus) erhalten:

{ 
    "aggregate": "__collection__", 
    "pipeline": [{ 
     { 
      "$project": { 
       "prefixLength": { 
        "null": ["$prefix"] 
       } 
      } 
     }] 
    } 
} 

Ich kann mein agg Objekt hat diese Projektionsoperation sehen, dass:

expression -> strLenCP(prefix) 
field -> AggregationField: AggregationField - name: prefixLength, target: prefixLength, synthetic: true 
params -> [] 

Ich bin mir nicht sicher, dass das korrekt ist, aber ich kann keine Dokumentation finden, die StrLenCP verwendet. Ich fand nur diesen Test, der die strLenCP Projektion verwendet: https://github.com/spring-projects/spring-data-mongodb/blob/dc57b66adfd60b4d69d1d349b4fcfa4ab0da95e7/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java#L922

Könnte jemand bitte helfen?

Prost

+0

danke @Sagar Reddy für die Formatierung – marcesso

+0

Np. In welcher Version von spring-mongo-db bist du? – Veeram

+0

mongo-java-driver version ist 3.4.0 und org.springframework.data ist 1.9.5.RELEASE – marcesso

Antwort

2

Die Unterstützung für Mongo3.4 Aggregationsoperatoren wurden in 1.10.0.RC1 hinzugefügt. Wenn Sie mit der Aktualisierung der Kandidatenversion in Ordnung sind, sollte alles gut funktionieren.

Oder Sie können Folgendes versuchen, aber Sie müssen 1.8.5 Version verwenden.

Aggregation aggregation = newAggregation(
    project().and(new AggregationExpression() { 
     @Override 
     public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) { 
      return new BasicDBObject("$strLenCP", "$prefix"); 
     } 
    }).as("prefixLength") 
); 
+0

1.10.0 RC1 fügt Aggregationsoperatoren als API hinzu und macht mehrere Aggregationsausdrücke über [SpEL support] (https: // github. com/feder-projects/feder-daten-beispiele/pull/243/commits/8b407165d9f1999a146daf7bf0088c768c075415 # diff-a646e0988d082bfbb13a36e8760b1b74R233). – mp911de

+0

vielen dank @Sagar Reddy, die DBObject Lösung funktioniert perfekt. Ich kann RC nicht verwenden, da der Code, den ich schreibe, sehr bald in der Produktion benötigt wird, aber ich werde aktualisieren, wenn verfügbar – marcesso

Verwandte Themen