2017-02-21 3 views
0

Ich versuche, MongoDb-Abfrage mit Aggregation Framework mit Java-Treiber zu konvertieren. Mir wurde geholfen, hier Abfrage How to apply filter for output of aggregation framework of Mongo Db? zu erstellen. HierAggregat-Abfrage konvertieren MongoDb zu BasicDbObject Java

ist die Probe Aggregatabfrage:

db.movies.aggregate(
[{ 
    $redact: { 
     $cond: { 
      if: {$gt: [{ $avg: "$customerReviews"}, 7 ] }, 
      then: "$$KEEP", 
      else: "$$PRUNE" 
     } 
    } 
}, 
{$skip:1}, 
{$limit:2} 
] 
); 

Ich begann mit:

BasicDBObject avgQuery = new BasicDBObject("$avg", "$customerReviews"); 

aber kann nicht herausfinden, wie man durchführen {$ gt: [{$ avg: "$ customerReviews"} , 7]}. Ich denke, es sollte so etwas wie gtQuery.put (avgQuery, neues BasicDbObject ("$ gt", 7)) aber kann natürlich nicht etwas anderes als String in put() -Funktion setzen.

Btw, Ich bin mir nicht sicher, ob $ redact nur mit BasicDbObject getan werden kann oder ich brauche etwas wie Mongo spring query where two fields are equal, die Spring Mongo verwendet. Hoffe, jemand kann mir helfen, die ganze Frage zu beantworten.

Antwort

2

BasicDBObject ist alte 2.x Mongo Version Klassen. Verwenden Sie die neueren 3.x API-Klassen.

Ich sehe keine Hilfsklasse, redact Pipeline im Java-Treiber zu erstellen.

MongoClient mongoClient = new MongoClient(); 
MongoDatabase database = mongoClient.getDatabase("dbname"); 
MongoCollection<Document> collection = database.getCollection("dbcollection"); 
List<Document> results = collection.aggregate(Arrays.asList(
      new Document("$redact", new Document("$cond", 
        Arrays.asList(new Document("$gt", 
        Arrays.asList(new Document("$avg", "$customerReviews"), 7)), 
        "$$KEEP", "$$PRUNE"))), 
      Aggregates.skip(1), 
      Aggregates.limit(2) 
)).into(new ArrayList<>()); 

Alternativ können Sie verwenden

String redact = "{\n" + 
      " $redact: {\n" + 
      "  $cond: {\n" + 
      "   if: {$gt: [{ $avg: \"$customerReviews\"}, 7 ] },\n" + 
      "   then: \"$$KEEP\",\n" + 
      "   else: \"$$PRUNE\"\n" + 
      "  }\n" + 
      " }\n" + 
      "}"; 

List<Document> results = collection.aggregate(Arrays.asList(
      Document.parse(redact), 
      Aggregates.skip(1), 
      Aggregates.limit(2) 
)).into(new ArrayList<>());