1. 一: 聚合

    常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce。

    <1> count

    count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样

db.user.count()
db.user.count({"age":30})

<2> distinct

这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图。

db.user.find()
db.user.distinct("age")

<3> group

在mongodb里面做group操作有点小复杂,不过大家对sql server里面的group比较熟悉的话还是一眼能看的明白的,其实group操作本质上形成了一种“k-v”模型,就像C#中的Dictionary,好,有了这种思维,

我们来看看如何使用group。

下面举的例子就是按照age进行group操作,value为对应age的姓名。下面对这些参数介绍一下:

key:  这个就是分组的key,我们这里是对年龄分组。

initial: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=20的value的list分享一个initial函数,age=22同样也分享一个initial函数。

$reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次为initial中的{”perosn“:[]}。有多少个文档, $reduce就会调用多少次。

db.user.group({
"key":{"age":true},
"initial":{"person":[]},
"$reduce":function(cur,prev){
prev.person.push(cur.name);}
}
)

看到上面的结果,是不是有点感觉,我们通过age查看到了相应的name人员,不过有时我们可能有如下的要求:

①:想过滤掉age<33一些人员。

②:有时person数组里面的人员太多,我想加上一个count属性标明一下。

针对上面的需求,在group里面还是很好办到的,因为group有这么两个可选参数: condition 和 finalize。

condition:  这个就是过滤条件。

finalize:这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了。

db.user.group({
"key":{"age":true},
"initial":{"person":[]},
"reduce":function(doc,out){
out.person.push(doc.name);
},
"finalize":function(out){
out.count=out.person.length;
},
"condition":{"age":{$lt:33}}
}
)

<4> mapReduce

这玩意算是聚合函数中最复杂的了,不过复杂也好,越复杂就越灵活。

mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。

① map:

这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。

② reduce:

这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是

emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。

③ mapReduce:

这个就是最后执行的函数了,参数为map,reduce和一些可选参数。具体看图可知:

从图中我们可以看到如下信息:

result: "存放的集合名“;

input:传入文档的个数。

emit:此函数被调用的次数。

reduce:此函数被调用的次数。

output:最后返回文档的个数。

最后我们看一下“collecton”集合里面按姓名分组的情况。

二:游标

mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:

var list=db.person.find();

针对这样的操作,list其实并没有获取到person中的文档,而是申明一个“查询结构”,等我们需要的时候通过for或者next()一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,发现没有数据返回了。

var list=db.user.find();

list.forEach(function(x){
print(x.name);
})

当然我们的“查询构造”还可以搞的复杂点,比如分页,排序都可以加进去。

var single=db.user.find().sort({"name":1}).skip(2).limit(2);
single

那么这样的“查询构造”可以在我们需要执行的时候执行,大大提高了不必要的花销。

MongoDB之三(高级操作 聚合、游标)的更多相关文章

  1. SpringMVC整合Mongodb开发,高级操作

    开发环境: 操作系统:windows xpMongodb:2.0.6依 赖 包:Spring3.2.2 + spring-data-mongodb-1.3.0 + Spring-data-1.5 +  ...

  2. mongodb的高级操作(聚合框架)

    group by 查询 不要用java驱动带的group by ,要用2.2版本后的aggregate聚合框架来搞,经过试验速度快一倍 参考 官网:http://docs.mongodb.org/ma ...

  3. MongoDB三-高级操作

    复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html 今天跟大家分享一下mongodb中比较好玩的知识,主 ...

  4. mongodb数据库高级操作

    1.创建索引 2.索引名称 3.其他索引 4.explain 5.操作索引 6.高级特性 7.固定集合 8.导入导出 9.上锁 10.添加用户 11.主从复制

  5. MongoDB学习--高级查询 [聚合Group]

    Group大约需要一下几个参数. key:用来分组文档的字段.和keyf两者必须有一个 keyf:可以接受一个javascript函数.用来动态的确定分组文档的字段.和key两者必须有一个 initi ...

  6. mongodb高级操作及在Java企业级开发中的应用

    Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...

  7. MongoDB高级操作

    参考MongoDB菜鸟教程 一.$type操作符 MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1   String 2   Object 3   Array 4   ...

  8. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  9. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

随机推荐

  1. one makefile file

    #gcc test.cpp -L. -Wl,-Bdynamic -ltestlib -Wl,-Bstatic -ltestlib -Wl,-Bdynamic #make clean; make ini ...

  2. WF4的数据库 表

    WF4的数据库 表 SQL 建表 SqlPersistenceProviderSchema.sql InstanceData 实例数据表 SqlPersistenceService_Schema.sq ...

  3. C# WinForm实现控件拖动实例介绍

    主要是设计控件的MouseDown.MouseLeave.MouseMove事件.一步步来吧:1.定义一个枚举类型,描述光标状态 private enum EnumMousePointPosition ...

  4. 《Effective Java》读书笔记

    一.引言 1.几条基本规则:(清晰性和简洁性最为重要) 模块的用户永远也不应该被模块的行为所迷惑(那样就不清晰了),模块要尽可能小,但又不能太小 代码应该被重用,而不是被拷贝 模块之间的依赖性应该尽可 ...

  5. TDD三大定律

    You must write a failing unit test before you write production code. You must stop writing that unit ...

  6. Python设计模式——单例模式

    单例模式是日常应用中最广泛的模式了,其目的就是令到单个进程中只存在一个类的实例,从而可以实现数据的共享,节省系统开销,防止io阻塞等等 但是在多进程的应用中,单例模式就实现不了了,例如一些web应用, ...

  7. uvision4 ide已停止工作

    情景描述: 笔者安装了新系统WIN8.1,装上了MDKV4.72.MDK编译程序可以正常工作,可是只要当我“下载程序”或者“调试程序”的时候就提示“uvision4 ide已停止工作”,迫不得已只能关 ...

  8. 查看uCOS-II的CPU使用率

    代码模板: void main(void) { OSInit(); /* 安装uCOS-II的任务切换向量 */ /* 创建用户起始任务TaskStart */ OSStart(); } void T ...

  9. codevs 1540 银河英雄传说

    题目描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米 ...

  10. struts2 查 找总结

    0:38 2013/5/25 查 找 * * |-_-查找全部 Action层的home方法中的查找方法创建时不需要带个查找对象的参数 service层不用组织条件 dao层一条查询所有的hql语句S ...