2016-09-06 230 views
1

我在mongodb中使用聚合查询来查找集合中存在的所有文档中属性的总和。如何在spring mongotemplate中存储mongodb聚合查询结果?

查询

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的返回结果对象,并从中提取的特定字段。

请帮忙。

回答

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

谢谢Wasiq。你能告诉结果数据类型吗?我知道final是int。 –

+0

这并没有解决问题。我仍然想知道mongo db会返回什么对象,以及如何将它保存在java中。 –

+0

mongo的结果是一个'document'对象,你可以将它保存为普通对象 –