Неполный совокупный результат с Джонго
Я использую агрегатную среду MongoDB для запроса документа, результаты следующие:
{
"result" : [
{
"_id" : "luke",
"times" : 8
},
{
"_id" : "albert",
"times" : 4
},
{
"_id" : "matt",
"times" : 4
}
],
"ok" : 1
}
Как видно из приведенного выше результата, запрос работает в оболочке mongoDB, но у меня есть проблема при получении результатов с помощью Jongo:
Aggregationoutput =
gamesCollection.aggregate(
"{ ... }"
).as(Aggregation.class);
output.results().iterator().hasNext();
Кажется, главная проблема в том, что Jongo не позволяет мне использовать AggregationOutput
? он хочет вместо Aggregation
... но не могу найти ни одного примера о том, как его использовать
РЕДАКТИРОВАТЬ: Я немного расстроен, что я не могу заставить Джонго работать с совокупностью. Я должен был написать запрос с DBObjects
как указано в драйвере MongoDB Java, но код выглядит действительно некрасиво..
РЕДАКТИРОВАТЬ 2: Просто, чтобы завершить информацию, это оригинальный агрегат, который я использовал с Jongo, который не смог разобрать ResultObject
List<ResultObject> output =
gamesCollection.aggregate(
"{ $match: { 'playersList.playerid': 'bob' }},"
+"{ $unwind: '$playersList' },"
+"{ $match: { 'playersList.playerid': { $ne: 'bob' } } },"
+"{ $group: { _id: '$playersList.playerid', times: { $sum : 1} } },"
+"{ $sort: { times: -1 } }"
).as(ResultObject.class);
class ResultObject{
String _id;
int times;
}
}
2 ответа
Вы можете использовать функцию агрегирования, такую как find/findOne... Результаты автоматически передаются в Pojo:
List<Email> emails = collection.aggregate("{$project:{sender:1}}")
.and("{$match:{tags:'read'}}")
.and("{$limit:10}")
.as(Email.class);
Вы можете найти больше примеров здесь: https://github.com/bguerout/jongo/blob/master/src/test/java/org/jongo/AggregateTest.java
Я только что видел этот вопрос сейчас, но я надеюсь, что он может помочь другим. Вы можете создать внутренний класс следующим образом:
private static class AggregateResult {
String _id;
int time;
}
И вызовите агрегатную функцию следующим образом:
List<AggregateResult> res = gamesCollection.aggregate(
"{ ... }"
).as(AggregateResult.class);
Затем вы можете перебрать результаты в списке res.