2013-03-23 3 views
2

Я использую структуру совокупного MongoDB для запроса документа, результатов заключается в следующем:маршализацию совокупного результата с Джонго

{ 
     "result" : [ 
       { 
         "_id" : "luke", 
         "times" : 8 
       }, 
       { 
         "_id" : "albert", 
         "times" : 4 
       }, 
       { 
         "_id" : "matt", 
         "times" : 4 
       } 
     ], 
     "ok" : 1 
} 

Как видно из результата выше, запрос работает в MongoDB оболочке, но у меня есть проблема, когда при получении результатов с Джонго:

 Aggregationoutput = 
       gamesCollection.aggregate(
       "{ ... }" 
       ).as(Aggregation.class); 
     output.results().iterator().hasNext(); 

Основная проблема, кажется, что Джонго не позволяет мне использовать AggregationOutput? он хочет, чтобы вместо Aggregation ... но не могу найти ни одного примера, доступного о том, как использовать его

EDIT: Я немного разочарован тем, что я не могу сделать Джонго работать с агрегатом. Я должен был написать запрос с DBObjects, как указано в драйвере MongoDB Java, но код выглядит действительно некрасиво ..

EDIT2: Просто, чтобы дополнить информацию, это оригинал агрегатный я использовал с Джонго который не могли маршализацию к 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; 
} 

}

+0

Можете ли вы поделиться кодом класса Aggregation и полным набором collection.aggregate (..), который вы запрашиваете с Jongo? Благодарю. –

+0

Я пойду за быстрым и грязным решением, когда у меня будет время, я вернусь и пересмотрю ваши предложения. Большое спасибо за помощь – nuvio

+0

Как пожелаете. Мне кажется, что с вашим полным кодом мы можем решить это через пару минут. –

ответ

4

Вы можете использовать совокупную функцию, как поиск/findOne ... Результаты автоматически unmarshalled в 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

0

Я только что видел этот вопрос, но я надеюсь, что это может помочь другим. Вы можете создать внутренний класс, как это:

private static class AggregateResult { 
     String _id; 
     int time; 
    } 

И вызовите агрегатную функцию следующим образом:

List<AggregateResult> res = gamesCollection.aggregate(
       "{ ... }" 
       ).as(AggregateResult.class); 

Затем вы можете перебирать результаты в списке Реза.