MongoDB学习笔记-05 聚合

MongoDB除了基本查询功能之外,还有强大的聚合工具,其中包括:count()、distinct()、group()、mapreduce.

计数函数count

count是最简单的聚合工具,用于返回文档的数量:

>db.user.count() // 返回集合user的个数

传递查询文档时,则计算查询结果的数量:

>db.user.count({"age":{"$lt":20}}) // 返回年龄小于20岁的用户数

该函数对于分页时的总数非常有必要

去重函数distinct

distinct函数用来找出给定键的所有不同的值。使用时必须指定集合和键:

>db.runCommand({"distinct":"user","key":"age"}) // 获取age键的不同的值

有时候需要获取集合中所有不同的键,此时需要自己编写MapReduce,内置没有这样的函数。

values返回键所对应的所有不同的值,数组形式。

stats返回distinct过程的一些指标。

n:返回的集合数量,

nscanned:扫描过的文档数量,

timems:耗费的时间(毫秒),

cursor:使用的索引(BasicCursor:无索引,BtreeCursor)

分组函数group

MongoDB会根据分组依据的键将集合分成若干个组,再聚合每个组内的文档。

>db.runCommand({"group":{

"ns":"user",

"key":"day",

"initial":{"time":0},

"$reduce":function(doc,prev){

if(doc.time>prev.time){

prev.price = doc.price;

prev.time = doc.time;

}

},

"condition":{"day":{"$gt":"2014/12/21"}}

}})

"ns":"user":指定分组的集合为user

"key":"day":指定文档分组依据的键

"initial":{"time":0}每一组reduce函数调用的时间,会作为初始文档传递给后续过程。

"$reduce":每个文档都对应一次这个调用。系统会传递两个参数:当前文档和累加器文档。

"condition":指定条件

使用完成器:finalizer

完成器finalizer用于精简数据库传给用户的数据,group命令的输出一定要能放到单个数据库响应中。

>db.runCommand({"group":{

"ns":"post",

"key":"{"tags":true}", // 等同于"key":"tags"

"initial":{"tags":{}},

"$reduce":function(doc,prev){

for(i in doc.tags){

if(doc.tags[i] in prev.tags){

prev.tags[doc.tags[i]]++;

}else{

Prev.tags[doc.tags[i]]=1;

},

"finalize":function(prev){

var mostPopular = 0;

for(i in prev.tags){

if(prev.tags[i]>mostPopular){

prev.tag=i;

mostPopular=prev.tags[i];

}

}

Detete prev.tags

}

}}})

将$reduce处理后的结果再进行处理,然后返回给客户端。

将函数作为键使用

定义分组函数时使用"$keyf"代替"key":

"$keyf":function(x){return x.category.toLowerCase();}

MapReduce

count、distict、group能做的事,MapReduce都能做。MapReduce的基本使用如下:

>mr=db.runCommand({"mapreduce":"user","map":map,"reduce":reduce})

"mapreduce":对哪个集合作处理

"map":map函数,可以在上述命令前先定义

"reduce":reduce函数,可以在上述命令前先定义

map函数使用函数emit返回要处理的值,this表示对当前文档的引用:

>map=function(){

for(var key in this){

emit(key,{ "count":1});

}};

reduce能处理emit返回的文档和其他reduce结构的各种组合:

>reduce=function(key,emits){

total = 0;

for(var I in emits){

total+=emits[i].count;

}

return {"count":total};

}

MapReduce函数的返回文档类似如下:

result:存放mapreduce结果的集合名,为临时集合,mapreduce连接关闭后自动删除。

timeMillis:操作花费的时间,单位毫秒

input:发生到map函数的文档个数

emit:在map函数中emit被调用的次数

output:结果集合中创建的文档数量。

MapReduce的其他可选键

MapReduce命令除了必须的键:mapreduce、map、reduce之外,还有如下的可选键:

finalize:对reduce的输出结果作进一步处理

keeptemp:连接关闭时,临时集合是否保存。

output:结果集合的名字,设定该项则隐含着keeptemp:true。

query:会在发往map函数前,先用指定条件过滤文档。

sort:在发往map前先给文档排序。

limit:发往map函数的文档数量的上限。

scope:javaScript代码中要用到的变量(变量名:值)。

verbose:是否产生更加详细的服务器日志。

时间: 2024-07-28 14:07:07

MongoDB学习笔记-05 聚合的相关文章

mongodb 学习笔记05 --用户管理

csdn的markdown编辑器真有够烂的,这篇文章又给弄丢了 启用认证 mongod 启动默认没有开启权限,你须要指定 –auth 启动.或者在配置文件里设置security.authorization 为 "enabled" 创建用户 db.createUser(user, writeConcern) 文档 http://docs.mongodb.org/manual/reference/method/db.createUser/#db.createUser user格式 { us

mongodb 学习笔记 05 -- 用户管理

启用认证 mongod 启动默认没有开启权限,你需要指定 –auth 启动,或者在配置文件中设置security.authorization 为 "enabled" 创建用户 db.createUser(user, writeConcern) 文档 http://docs.mongodb.org/manual/reference/method/db.createUser/#db.createUser user格式 { user: "<name>", pw

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

MongoDB学习笔记一:MongoDB的下载和安装

趁着这几天比较空闲,准备学习一下MongoDB数据库,今天就简单的学习了一些MongoDB的下载和安装,并创建了存储MongoDB的数据仓库.将自己今天学习到的写成博客分享给大家. 一.MongoDB的下载和安装 MongoDB的下载地址为:http://www.mongodb.org/ 1.进入官网的首页后,在首页的右上方单击Downloads连接,如图所示: 2.在页面中可以看到目前最新的版本和以前发布过的版本,这里选择最新版本,windows 32位的进行下载,文件的格式为ZIP格式的,单

MongoDB学习笔记(一:安装时出现The default storage engine &#39;wiredTiger&#39; is not available问题解决)

今晚在自己老式笔记本来试了一下MongoDB的安装,由于配置比较低,只能选择32位版本的MongoDB进行安装,在安装过程中碰到了上述标题所示错误,自己也捣鼓了一个小时左右,终于在一篇博客中找到答案,具体原文链接如下:http://blog.csdn.net/u013457382/article/details/50775268 MongoDB学习笔记(一:安装时出现The default storage engine 'wiredTiger' is not available问题解决)

Mongodb学习笔记

总结下这几天Mongodb学习笔记 /** * 获取MongoClient * @author xuyw * @email [email protected] * @param host * @param port * @return */ public static MongoClient getMongoClient(String host, int... port) { MongoClient mongoClient = null; int portlen = 0; try { if (p

[Spring Data MongoDB]学习笔记--建立数据库的连接

1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoDbFactory { DB getDb() throws DataAccessException; DB getDb(String dbName) throws DataAccessException; } 然后我们可以继续用MongoDbFactory来创建MongoTemplate的实例. pu

mongodb学习笔记系列一

一.简介和安装 ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017 mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,--smallfiles 二.基本命令 1.登录mongodb client /use/local/mongo 2.查看当前数据库 show databases; show dbs; 两个可能 3.admin是和管理有关的库,local 是放schema有关