MongoDB:详细解释mongodb的高级操作,聚合和游标

前几天总结了mongodb的安装入门、详细解释了增删改查的基本操作,今天再来总结下mongodb更高级的操作,聚合和游标。

一、聚合,mongodb的聚合操作一般分为四种情景,分别是:count、distinct、group、mapReduce

1、count

count最简单,最容易,也是我们最常用的聚合工具,话说最常用的大家都会用,所以对大家都不是问题,所以叫最简单~~奋斗

count
db.person.find()
db.person.count()
db.person.count({"age":40})

2、distinct

顾名思义,指定了谁,谁就不能重合。

db.person.distinct("age")

3、group

group的操作有些小复杂,但是越是复杂的操作,应用起来就越灵活,group的操作本质上相当于一种“key-value”模型。

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

key: 这个就是分组的key,我们这里是对年龄分组。
initial: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=10的value的list分享一个initial函数,age=40同样也分享一个initial函数。
$reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次为initial中的{”perosn“:[]}。有多少个文档,

$reduce就会调用多少次。

group

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



上面的结果,有时候我们还可能会有其他的需求,例如:

1、过滤掉age<26岁的成员。

2、有时候person的成员太多,我不可能一一查看,所以我想count一下,这样看起来也比较方便。

这在group是非常容易办到的,因为mongodb有两个可选参数:condition 和finalize

condition 是个过滤条件

finalize 是一个方法,每个文章执行完后,都会触发它,可以在这个方法里面加入count。

condition 和 finalize
db.person.group({
	"key":{"age":true},
	"initial":{"person":[]},
	"$reduce":function(cur,prev){
	  	prev.person.push(cur.name);
	},
	"finalize":function(count){
		out.count=out.person.length;
	},
	"condition":{"age":{$gte:10}}
})


4、 mapReduce

mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。
1、map:
这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。
2、reduce:
这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是
emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。
3、mapReduce:
这个就是最后执行的函数了,参数为map,reduce和一些可选参数。具体看图可知:


mapReduce

map
function(){
	emit(this.name,{count:1});
}

reduce
function(key,value){
	var result={count:0};
	for(var i=0;i<value.length;i++){
		result.count += value[i].count;
	}
	return result;
}

db.person.mapReduce(map,reduce,{"out":"collection"})
{
	"result":"collection",
	"timeMillis":15,
	"counts":{
		"input":7,
		"emit":7,
		"reduce":3,
		"output":4
	},
	"ok":1,
}


从图中我们可以看到如下信息:
result: "存放的集合名“;
input:传入文档的个数。
emit:此函数被调用的次数。
reduce:此函数被调用的次数。
output:最后返回文档的个数。

二、游标

mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:
var list=db.person.find();
针对这样的操作,list其实并没有获取到person中的文档,而是申明一个“查询结构”,等我们需要的时候通过for或者next()一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,发现没有数据返回了。

游标

var list = db.person.find();

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


同时,我们也可以查用分页、排序等查询!

这样可以减少不必要的开销

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


好啦,聚合和游标基本就这些,如果有不对的地方敬请指正。

原创文章,转载请注明出处:http://blog.csdn.net/jessonlv

下期会写关于mongodb索引的建立等操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.了解Spring 2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。Spring Data MongoDB 1.7中有什么新功能 6.依赖 6.1。Spring Boot的依赖管理 6.2。Spring框架 7.使用Spring Data Repositories 7.1。核心概念 7.2。查询方法 7.3。定义存储库接口 7.3.1。微调储存库定义 7.3.2。空处理存储库方法 7.3.3。将存储库与多个Spring Data模块一起使用 7.4。定义查询方法 7.4.1。查询查询策略 7.4.2。查询创建 7.4.3。属性表达式 7.4.4。特殊参数处理 7.4.5。限制查询结果 7.4.6。流式查询结果 7.4.7。异步查询结果 7.5。创建存储库实例 7.5.1。XML配置 7.5.2。JavaConfig 7.5.3。独立使用 7.6。Spring Data存储库的自定义实现 7.6.1。定制个人存储库 7.6.2。自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例存储库 9.3。用Spring连接到MongoDB 9.3.1。使用基于Java的元数据注册Mongo实例 9.3.2。使用基于XML的元数据注册Mongo实例 9.3.3。MongoDbFactory接口 9.3.4。使用基于Java的元数据注册MongoDbFactory实例 9.3.5。使用基于XML的元数据注册MongoDbFactory实例 9.4。MongoTemplate简介 9.4.1。实例化MongoTemplate 9.4.2。WriteResultChecking策略 9.4.3。WriteConcern 9.4.4。WriteConcernResolver 9.5。保存,更新和删除文档 9.5.1。如何_id在映射图层中处理该字段 9.5.2。类型映射 9.5.3。保存和插入文件的方法 9.5.4。更新集合中的文档 9.5.5。在集合中插入文档 9.5.6。在集合中查找和插入文档 9.5.7。删除文件的方法 9.5.8。乐观锁定 9.6。查询文件 9.6.1。查询集合中的文档 9.6.2。查询文件的方法 9.6.3。查询不同的值 9.6.4。地理空间查询 9.6.5。GeoJSON支持 9.6.6。全文查询 9.6.7。排序规则 9.6.8。JSON模式 9.6.9。流利的模板API 9.7。按实例查询 9.7.1。介绍 9.7.2。用法 9.7.3。示例匹配器 9.7.4。执行一个例子 9.7.5。无类型示例 9.8。减少地图操作 9.8.1。使用示例 9.9。脚本操作 9.9.1。使用示例 9.10。集团运营 9.10.1。使用示例 9.11。聚合框架支持 9.11.1。基本概念 9.11.2。支持的聚合操作 9.11.3。投影表达式 9.11.4。分面分类 9.12。用自定义转换器覆盖默认映射 9.12.1。使用已注册的Spring Converter进行保存 9.12.2。使用Spring转换器读取 9.12.3。使用MongoConverter注册Spring转换器 9.12.4。转换器消除歧义 9.13。索引和集合管理 9.13.1。创建索引的方法 9.13.2。访问索引信息 9.13.3。使用集合的方法 9.14。执行命令 9.14.1。执行命令的方法 9.15。生命周期事件 9.16。例外翻译 9.17。执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于Java的元数据注册MongoClient实例 10.2.2。ReactiveMongoDatabaseFactory接口 10.2.3。使用基于

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值