2016-09-06 2 views
1

Я использую агрегированный запрос в mongodb, чтобы найти сумму атрибута во всех документах, имеющихся в коллекции.Как сохранить результат запроса агрегата mongodb в весенний mongotemplate?

Запрос:

db.conversation.aggregate( [ 
{ 
    $match:{ 
     $and:[{"mailBoxId":"1","isHidden":false}] 
     } 
}, 
{ 
    $group: 
    { 
     _id: {"mailBoxId":"$mailBoxId","isHidden":"$isHidden"} , 
     messageCount: { $sum:"$messageCount" } 
    } 
} 
]); 

результат возвращаемый MongoDB прекрасно и в этом формате.

{ 
"result" : [ 
    { 
     "_id" : { 
      "mailBoxId" : "2", 
      "isHidden" : false 
     }, 
     "messageCount" : 2 
    } 
], 
"ok" : 1 
} 

Я просто хочу поле messageCount. Я использую класс MongoTemplate (Spring) для запроса базы данных.

Query retrievalQuery = new Query(); 
    retrievalQuery.addCriteria(Criteria.where("mailBoxId").is(userId).and("isHidden").is(false)); 
    return mongoTemplate.find(retrievalQuery,); 

Я смущен, как сохранить результирующий объект, возвращаемый MongoDB и извлечь определенную область из него.

Помощь Pls.

ответ

1

, как вы пытаетесь использовать агрегат в mongoTemplate неправильно. Попробуйте это, я уверен, что это поможет.

Aggregation agg = Aggregation.newAggregation(
     Aggregation.match(
       Criteria.where("mailBoxId").is("1").and("isHidden").is(false)), 
     Aggregation.group("$mailBoxId").sum("$unReadMessagesCount").as("unReadMessagesCount") 
    ); 


System.out.println("Query ==>>["+agg.toString()+"]"); 
AggregationResults<AggResultObj> data = mongoTemplate.aggregate(agg, "collectionName", AggResultObj.class); 

System.out.println("UnReadMesasgeCode :"+data.getUniqueMappedResult().getUnReadMessagesCount()); 

AggResultObj будет выглядит как

public class AggResultObj{ 
    String _id; 
    int unReadMessagesCount; 

    public String get_id() { 
     return _id; 
    } 
    public void set_id(String _id) { 
     this._id = _id; 
    } 
    public int getUnReadMessagesCount() { 
     return unReadMessagesCount; 
    } 
    public void setUnReadMessagesCount(int unReadMessagesCount) { 
     this.unReadMessagesCount = unReadMessagesCount; 
    } 
} 

Для получения дополнительной информации вы можете увидеть мой блог, где я создал пример для того же для вашего сценария. пожалуйста, нажмите https://satishkumardangi.blogspot.in/2016/09/using-mongo-db-aggregation-with-spring.html

+0

Это сработало! Благодаря!!! –

0

Попробуйте

Query retrievalQuery = new Query(); 
    retrievalQuery.addCriteria(Criteria.where("mailBoxId").is(userId).and("isHidden").is(false)); 
var result = mongoTemplate.find(retrievalQuery); 
var final = result[1].messageCount; 
    return final; 
+0

Thanks Wasiq. Не могли бы вы рассказать тип данных результата. Я знаю, что финал будет int. –

+0

Это не решило проблему. Мне все еще интересно, какой объект возвращает mongo db и как его сохранить в java. –

+0

результат от mongo - это объект 'document', который вы можете сохранить как обычные объекты –