Как написать редактирование агрегации в Java?

Я пытаюсь конвертировать запрос MongoDb, используя структуру агрегации, используя драйвер Java. Мне помогли создать запрос здесь. Как применить фильтр для вывода структуры агрегации Mongo Db?,

Вот пример совокупного запроса:

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: [{ $avg: "$customerReviews"}, 7 ] }. Я думаю, что это должно быть что-то вроде gtQuery.put(avgQuery, new BasicDbObject("$gt",7)), но, очевидно, не может поместить что-то кроме String в функцию put().

Кстати, я не уверен, что $redact можно сделать только с помощью BasicDbObject или мне нужно что-то вроде Mongo spring query, где два поля равны, что использует Spring Mongo. Надеюсь, кто-нибудь может помочь мне пройти весь запрос.

1 ответ

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

Я не вижу вспомогательного класса для создания 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<>());
Другие вопросы по тегам