2017-02-21 13 views
0

Я пытаюсь преобразовать запрос MongoDb с использованием структуры агрегации с помощью Java-драйвера. Мне помогли создать запрос здесь How to apply filter for output of aggregation framework of Mongo Db?.Преобразовать агрегированный запрос MongoDb в BasicDbObject Java

Вот пример агрегатных запросов:

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

Я начал с:

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

Но не могу понять, как выполнить {$ Gt: [{$ ср: "$ customerReviews"} , 7]}. Я думаю, что это должно быть что-то вроде gtQuery.put (avgQuery, новый BasicDbObject («$ gt», 7)), но, очевидно, не может помещать что-то другое, кроме String в функцию put().

Btw, я не уверен, что $ redact можно сделать только с использованием BasicDbObject или мне нужно что-то вроде Mongo spring query where two fields are equal, которое использует Spring Mongo. Надеюсь, кто-то может помочь мне пройти весь запрос.

ответ

2

BasicDBObject старый 2.x mongo версия классы. Используйте новые классы api 3.x.

Я не вижу никакого вспомогательного класса для создания конвейера redact в драйвере java.

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

В качестве альтернативы вы можете использовать

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