Как написать редактирование агрегации в 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<>());