一: 聚合
常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce。
1、count:返回集合中的文档个数
> db.foo.count()
2、distinct:找出给定键的所有不同的值。使用时必须指定集合和键
> db.runCommand({"distinct":"mycolldis","key":"age"}) mycolldis为“集合”名称,age为“键”名称
例如:假设有如下文档:
{"name":"Ada","age":20}
{"name":"Fred","age":35}
{"name":"Susan","age":60}
{"name":"Andy","age":35}
对"age"键使用distinct,获得所有不同的年龄:
> db.runCommand({"distinct":"mycolldis","key":"age"}) mycolldis为“集合”名称,age为“键”名称
{"values":[20,35,60],"ok":1}
完美实例
1、创建集合
> use test
> db.mycolldis.save({})
2、为“mycolldis集合”添加“键/值”
> db.mycolldis.insert({"age":10})
> db.mycolldis.insert({"age":20})
> db.mycolldis.insert({"age":30})
> db.mycolldis.insert({"age":20})
> db.mycolldis.insert({"age":60})
> db.mycolldis.insert({"age":60})
3、查看信息
> db.mycolldis.find()
4、对"age"键使用distinct,获得所有不同的年龄
> db.runCommand({"distinct":"mycolldis","key":"age"})
5、结果
{
"values":[
10,
20,
30,
60
],
"stats":{
"n":7,
"nscanned":7,
"nscannedBojects":7,
"timems":0,
"cursor":"BasicCursor",
},
"ok":1
}
3、group
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和一些可选参数。
二:游标
mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:
var list=db.person.find();
针对这样的操作,list其实并没有获取到person中的文档,而是申明一个“查询结构”,等我们需要的时候通过for或者next()一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,发现没有数据返回了。
当然我们的“查询构造”还可以搞的复杂点,比如分页,排序都可以加进去。
var single=db.person.find().sort({"name",1}).skip(2).limit(2);
那么这样的“查询构造”可以在我们需要执行的时候执行,大大提高了不必要的花销。