`
garyli
  • 浏览: 175807 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mongodb sum 操作

阅读更多

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;
	}

 

 

分享到:
评论
1 楼 chenyi1125 2015-09-23  
StateStats  是自己定义的类吧,有哪些属性,如何与我要查的对象关联

相关推荐

    MongoDB 中聚合统计计算–$SUM表达式

    以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。 1.$group 直接看例子吧。 Case 1 测试集合mycol中的数据如下: { title: 'MongoDB Overview', description: 'MongoDB is...

    mongodb 数据库基本操作.doc

    ### MongoDB数据库基本操作详解 #### 一、连接MongoDB数据库 MongoDB是一个广泛使用的开源文档数据库,支持多种编程语言。为了能够与MongoDB交互并执行各种数据库操作,首先需要通过官方提供的驱动程序或其他第三...

    MongoDB Java操作大全 源代码 实例

    本资料包“MongoDB Java操作大全 源代码 实例”将深入探讨如何使用Java API进行MongoDB的操作。 1. **连接MongoDB** 在Java中,首先需要通过`MongoClient`类建立到MongoDB服务器的连接。例如: ```java ...

    MongoDB常用SQL操作

    以下是一些关于MongoDB常用SQL操作的关键知识点: 1. **数据模型**:MongoDB基于JSON(JavaScript Object Notation)格式的文档存储数据,这使得它能够存储复杂的数据结构,如嵌套对象和数组。 2. **连接MongoDB**...

    MongoDB基础操作指南.rar

    在本指南中,我们将深入探讨MongoDB的基础操作,包括安装、启动与停止服务、数据模型、查询、更新、删除以及一些高级特性。 一、安装MongoDB MongoDB的安装过程在不同的操作系统上略有不同。在Windows上,可以通过...

    MongoDB聚合操作详细步骤.pdf

    MongoDB中的聚合框架是一个强大且灵活的数据处理工具,它允许用户对存储在数据库中的数据执行各种操作,从简单的数据聚合到复杂的文本处理和数组操作等。 聚合框架的主要组成部分是管道(pipeline),它由多个处理...

    php操作mongodb详解

    在PHP中操作MongoDB是一种常见的任务,MongoDB是一种流行的NoSQL数据库,它以JSON格式存储数据,适合处理大量非结构化或半结构化数据。PHP的MongoDB扩展提供了一种简单的方式来与MongoDB交互。以下是关于如何使用PHP...

    mongodb 数据库基本操作.docx

    ### MongoDB 数据库基本操作知识点详解 #### 一、概述 MongoDB是一款开源的NoSQL数据库系统,它使用BSON(Binary JSON)格式存储数据,能够高效地处理大量的非结构化数据。由于其灵活性和高性能,MongoDB被广泛应用于...

    MongoDB的分析和报告的解决方案

    文档内可以嵌套其他文档、数组和其他复杂数据结构,这使得MongoDB能够轻松地存储和操作复杂的数据。 在进行数据分析时,MongoDB提供了强大的聚合框架。这个框架允许开发者通过一系列管道操作符对数据进行过滤、排序...

    ### MongoDB数据库基本操作大全

    集合名称.aggregate([ { $match: { "key": "value" } }, { $group: { _id: "$key", count: { $sum: 1 } } } ])`,通过管道对文档进行过滤、分组、排序等操作。 #### 十、备份与恢复 1. **备份:** - 使用`...

    基于java的mongodb开发环境搭建

    本节将详细介绍如何使用Java语言对MongoDB进行基本的操作,包括连接数据库、插入数据、查询数据等。 ##### 2.1 创建连接 在Java代码中,可以通过以下方式创建MongoDB连接: ```java import com.mongodb.Mongo; ...

    完整版 Python高级开发课程 高级教程 07 Python操作MongoDB数据库.pptx

    【Python高级开发课程 高级教程】中的第07部分主要涵盖了Python操作MongoDB数据库的知识。MongoDB是一种流行的NoSQL数据库系统,它以文档存储为主,适合处理大规模、非结构化或半结构化的数据。在Python中,我们通常...

    nodejs操作mongodb实现增删改查

    在本文中,我们将深入探讨如何使用Node.js与MongoDB数据库进行交互,实现基本的增、删、改、查(CRUD)操作。这对于初学者来说是一个重要的起点,因为这两个技术在现代Web开发中广泛应用于构建实时、高性能的应用...

    mongoDB 教程 视频+PDF

    - **配置文件**:默认情况下,MongoDB使用`/etc/mongod.conf`或`C:\Program Files\MongoDB\Server\4.4\bin\mongod.exe --config C:\mongodb\conf\mongod.cfg`(视操作系统而定)中的配置文件。 - **端口设置**:...

    mongodb数据库的一些简单实用

    ### MongoDB 数据库基础操作与高级特性详解 #### 一、MongoDB 基础操作 **1. 进入 MongoDB 数据库** 要进入 MongoDB 数据库环境,可以通过命令行工具实现。输入 `mongo` 后回车,即可进入 MongoDB 的 shell 模式...

    MongoDB 聚合管道(Aggregation Pipeline)

    4. $group:用于将文档根据一个或多个键(Key)进行分组,并可以对每个分组执行聚合操作,如求和(sum)、平均(avg)、最大值(max)、最小值(min)等。 5. $sort:对文档进行排序,可以指定多个字段作为排序的...

    Mongodb java包

    1. **mongodb-driver-3.6.0.jar**:这是MongoDB Java驱动程序的主要组件,它包含了连接MongoDB服务器、执行查询、更新和插入操作等所需的所有类和接口。3.6.0版本是这个驱动的一个特定版本,确保了与MongoDB 3.6版本...

    MongoDB基础

    在这个“MongoDB基础”的资料中,我们将会深入探讨MongoDB的基础知识,包括数据库操作、集合操作、索引创建以及聚合框架的使用。 1. **数据库操作**: MongoDB中的数据库是存储数据的逻辑单元。你可以通过`use ...

Global site tag (gtag.js) - Google Analytics