首页 文章

如何在spring mongotemplate中存储mongodb聚合查询结果?

提问于
浏览
1

我在mongodb中使用聚合查询来查找集合中存在的所有文档中的属性的总和 .

Query

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

Mongodb返回的 result 很好,并且采用这种格式 .

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

请帮忙 .

2 回答

  • 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());
    

    The AggResultObj will be looks like

    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

  • 1

    试试这个

    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;
    

相关问题