Mongodb 统计某个字段的和,可以使用聚合函数。
数据结构如下:
> db.message.findOne() { "_class" : "com.cyou.appwiki.bean.Message", "_id" : ObjectId("53997f80c451bf833288b882"), "content" : "power9li的回答2", "fromNick" : "power9li", "fromUid" : "5176923980", "pic1" : null, "pic2" : null, "pic3" : null, "qid" : "53997f4dc451bf833288b880", "time" : NumberLong("1402568587464"), "toUid" : "F34780D6A3CA543DB020D584A91CC8BB", "unreadCount" : 2 }
我要统计的是某个toUid的unreadCount的总数
我发现有两种方法可以实现,第一种是mapReduce的方式,我在《MongodDB权威指南》书里看到的:
db.runCommand({"group":{ "ns":"message", "key":"toUid", "initial":{"total":0}, "$reduce" : function(doc,prev){ prev.total += doc.unreadCount; }, "condition":{"toUid":"F34780D6A3CA543DB020D584A91CC8BB"} }});
返回的结果格式:
{ "retval" : [ { "total" : 13 } ], "count" : 5, "keys" : 1, "ok" : 1 }
第二种方法是在 http://www.w3cschool.cc/mongodb/mongodb-aggregate.html 看到的:
db.message.aggregate([ { $match : { "toUid" : "F34780D6A3CA543DB020D584A91CC8BB"}}, { $group : { _id : "$toUid", num_tutorial : {$sum : "$unreadCount"} }} ]);
返回的结果:
{ "result" : [ { "_id" : "F34780D6A3CA543DB020D584A91CC8BB", "num_tutorial" : 13 } ], "ok" : 1 }
在使用spring-mongo进行开发的时候,也对应两种方法
1:(老方法,支持spring-mongo所有版本)
public long findNewMessage(Integer appId, String userId) { Long total = 0l; String reduce = "function(doc, aggr){" + " aggr.total += doc.unreadCount;" + " }"; Query query = Query.query(Criteria.where("toUid").is(userId).and("appId").is(appId)); DBObject result = mongoTemplate.getCollection("message").group(new BasicDBObject("toUid", 1), query.getQueryObject(), new BasicDBObject("total", total), reduce); Map<String,BasicDBObject> map = result.toMap(); if(map.size() > 0){ BasicDBObject bdbo = map.get("0"); if(bdbo != null && bdbo.get("total") != null) total = bdbo.getLong("total"); } return total; }
方法2(只有spring-mongo 3.2以上才支持)
public long getNewMessageCount(Integer appId, String userId){ Long total = 0l; Aggregation aggregation = Aggregation.newAggregation( match(Criteria.where("toUid").is(userId).and("appId").is(appId)), group("toUid").sum("unreadCount").as("total") ); AggregationResults<StateStats> ar = mongoTemplate.aggregate(aggregation, "message", StateStats.class); List<StateStats> list = ar.getMappedResults(); if(list.size() > 0){ total = list.get(0).total; } return total; }
相关推荐
以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。 1.$group 直接看例子吧。 Case 1 测试集合mycol中的数据如下: { title: 'MongoDB Overview', description: 'MongoDB is...
MongoDB Java操作大全 源代码 实例
11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...
MongoDB基本操作
ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作
mongodb相关操作.txt
Java 连接MongoDB, java 连接mongodb的操作
针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。Schema-less,支持嵌入子文档:MongoDB是一个Schema-free的文档数据库。一个数据库...
.net平台(C#)MongoDB最新版操作类 MongoDB操作类源码包括添加、修改、删除和查询(包括分页)等同步及异步操作类完整的代码。 本项目是以最新版的MVC结合MongoDB呈现,对MongoDB有兴趣的朋友很有参考价值。 可以...
将mongodb的基本操作,增删查询等封装为一个基本类供人调用
mongodb数据库操作脚本
MongoDB基本操作之Python篇 连接数据库 MongoClient VS Connection
MongoDB若基本操作
nosql实验六- MongoDB的安装与基本操作.docx
MongoDB基本操作手册1
本demo适用于初学mongodb操作集合,文件使用
php Mongodb操作类,可以实现CURD等操作
将房产系统在一年多来使用的mongodb管理方面上做了一些基本管理操作的记录,包括了安装启动,还有对mongodb进行监控,备份和修复,安全认证等等,当然了,还没有涉及到分片
包内含:mongodb支持包、管理工具、相关文档。 文档由我个人整理及撰写,包括mongodb简述、java操作、shell操作、配置文件说明等。