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数据库基本操作详解 #### 一、连接MongoDB数据库 MongoDB是一个广泛使用的开源文档数据库,支持多种编程语言。为了能够与MongoDB交互并执行各种数据库操作,首先需要通过官方提供的驱动程序或其他第三...
本资料包“MongoDB Java操作大全 源代码 实例”将深入探讨如何使用Java API进行MongoDB的操作。 1. **连接MongoDB** 在Java中,首先需要通过`MongoClient`类建立到MongoDB服务器的连接。例如: ```java ...
以下是一些关于MongoDB常用SQL操作的关键知识点: 1. **数据模型**:MongoDB基于JSON(JavaScript Object Notation)格式的文档存储数据,这使得它能够存储复杂的数据结构,如嵌套对象和数组。 2. **连接MongoDB**...
在本指南中,我们将深入探讨MongoDB的基础操作,包括安装、启动与停止服务、数据模型、查询、更新、删除以及一些高级特性。 一、安装MongoDB MongoDB的安装过程在不同的操作系统上略有不同。在Windows上,可以通过...
MongoDB中的聚合框架是一个强大且灵活的数据处理工具,它允许用户对存储在数据库中的数据执行各种操作,从简单的数据聚合到复杂的文本处理和数组操作等。 聚合框架的主要组成部分是管道(pipeline),它由多个处理...
在PHP中操作MongoDB是一种常见的任务,MongoDB是一种流行的NoSQL数据库,它以JSON格式存储数据,适合处理大量非结构化或半结构化数据。PHP的MongoDB扩展提供了一种简单的方式来与MongoDB交互。以下是关于如何使用PHP...
### MongoDB 数据库基本操作知识点详解 #### 一、概述 MongoDB是一款开源的NoSQL数据库系统,它使用BSON(Binary JSON)格式存储数据,能够高效地处理大量的非结构化数据。由于其灵活性和高性能,MongoDB被广泛应用于...
文档内可以嵌套其他文档、数组和其他复杂数据结构,这使得MongoDB能够轻松地存储和操作复杂的数据。 在进行数据分析时,MongoDB提供了强大的聚合框架。这个框架允许开发者通过一系列管道操作符对数据进行过滤、排序...
集合名称.aggregate([ { $match: { "key": "value" } }, { $group: { _id: "$key", count: { $sum: 1 } } } ])`,通过管道对文档进行过滤、分组、排序等操作。 #### 十、备份与恢复 1. **备份:** - 使用`...
本节将详细介绍如何使用Java语言对MongoDB进行基本的操作,包括连接数据库、插入数据、查询数据等。 ##### 2.1 创建连接 在Java代码中,可以通过以下方式创建MongoDB连接: ```java import com.mongodb.Mongo; ...
【Python高级开发课程 高级教程】中的第07部分主要涵盖了Python操作MongoDB数据库的知识。MongoDB是一种流行的NoSQL数据库系统,它以文档存储为主,适合处理大规模、非结构化或半结构化的数据。在Python中,我们通常...
在本文中,我们将深入探讨如何使用Node.js与MongoDB数据库进行交互,实现基本的增、删、改、查(CRUD)操作。这对于初学者来说是一个重要的起点,因为这两个技术在现代Web开发中广泛应用于构建实时、高性能的应用...
- **配置文件**:默认情况下,MongoDB使用`/etc/mongod.conf`或`C:\Program Files\MongoDB\Server\4.4\bin\mongod.exe --config C:\mongodb\conf\mongod.cfg`(视操作系统而定)中的配置文件。 - **端口设置**:...
### MongoDB 数据库基础操作与高级特性详解 #### 一、MongoDB 基础操作 **1. 进入 MongoDB 数据库** 要进入 MongoDB 数据库环境,可以通过命令行工具实现。输入 `mongo` 后回车,即可进入 MongoDB 的 shell 模式...
4. $group:用于将文档根据一个或多个键(Key)进行分组,并可以对每个分组执行聚合操作,如求和(sum)、平均(avg)、最大值(max)、最小值(min)等。 5. $sort:对文档进行排序,可以指定多个字段作为排序的...
1. **mongodb-driver-3.6.0.jar**:这是MongoDB Java驱动程序的主要组件,它包含了连接MongoDB服务器、执行查询、更新和插入操作等所需的所有类和接口。3.6.0版本是这个驱动的一个特定版本,确保了与MongoDB 3.6版本...
在这个“MongoDB基础”的资料中,我们将会深入探讨MongoDB的基础知识,包括数据库操作、集合操作、索引创建以及聚合框架的使用。 1. **数据库操作**: MongoDB中的数据库是存储数据的逻辑单元。你可以通过`use ...