写在前面:
什么是聚合呢?聚合说简单点就是数据统计,数据分类。在MySQL中,我们知道,有count来统计总数,distinct去重复,等等。MongoDB中也有这个概念,这就是聚合。
MongoDB中除了基本的查询以外,还有很强大的聚合功能,其中简单的可以计算集合中的文档个数,复杂的可以用MapReduce
1.count 统计数量。
在MongoDB中可以用count来同意一个集合中的文档数量。
> use php //使用php这个库
switched to db php
> show collections //查看这个库下面有多少个集合
blog
foo
system.indexes
user
> db.blog.count() //使用count查看blog集合中的文档数量。3个。
3
>
当然也可以传递查询。比如查询age=18的人数是多少,也可以。
> db.blog.count({"title":"wowowo"}) //统计title为"wowowo"的文档的个数。为0个
0
> db.blog.count({"title":"wowowowo"})//统计title为"wowowowo"的文档的个数,为2个。
2
>
2.distinct
在MongdoDB中 distinct 用来找出给定键的所有不同的值,即是去重复,使用时,必须制定集合和键。
使用distinct 必须使用runCommand( )结合的方式。db.runCommand( )以前没说过。
> db.runCommand()
{ "errmsg" : "no such cmd: ", "bad cmd" : { }, "ok" : 0 }
> db.runCommand({"distinct":"blog","key":"title"}) //必须制定集合和键。制定blog集合,title键。
{
"values" : [
"wowowowo",
"okokok"
],
"stats" : {
"n" : 3,
"nscanned" : 3,
"nscannedObjects" : 3,
"timems" : 15,
"cursor" : "BasicCursor"
},
"ok" : 1
}
> db.runCommand({"distinct":"blog","key":"comments"}) //制定blog集合,comments键
{
"values" : [
"hao a hao a ",
"23224"
],
"stats" : {
"n" : 3,
"nscanned" : 3,
"nscannedObjects" : 3,
"timems" : 0,
"cursor" : "BasicCursor"
},
"ok" : 1
}
> db.runCommand({"distinct":"blog","key":"time"}) //key键。
{
"values" : [
ISODate("2012-01-10T03:38:45.515Z"),
"2011023023"
],
"stats" : {
"n" : 3,
"nscanned" : 3,
"nscannedObjects" : 3,
"timems" : 0,
"cursor" : "BasicCursor"
},
"ok" : 1
}
>
3.group
MongoDB中的group和mysql中的group分组差不多。
group做的聚合稍微复杂一些,先选定分组所依据的键,而后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。
比如有以下数据:表示股价的结合包含以千计的如下形式的文档。
{"day":"2010/10/03","time":"10/3/2010 03:57:01 GMT-400","price":4.23}
{"day":"2010/10/04","time":"10/4/2010 11:28:34 GMT-400","price":4.27}
{"day":"2010/10/03","time":"10/3/2010 05:00:51 GMT-400","price":4.10}
{"day":"2010/10/06","time":"10/6/2010 05:27:22 GMT-400","price":4.30}
{"day":"2010/10/04","time":"10/4/2010 08:24:58 GMT-400","price":4.01}
我们想获得介绍是每天的最后的价格表,就像这样:
{"day":"2010/10/03","time":"10/3/2010 05:00:51 GMT-400","price":4.10}
{"day":"2010/10/04","time":"10/4/2010 11:28:34 GMT-400","price":4.27}
{"day":"2010/10/06","time":"10/6/2010 05:27:22 GMT-400","price":4.30}
那么我们用group如何做到像这样的分组呢?
> db.runCommand({"group":{
... "ns":"stocks",
... "key":"day",
... "initial":{"time":0},
... "$reduce":function(doc,prev){
... if(doc.time>prev.time){
... prev.price=doc.price;
... prev.time=doc.time;
... }
... }}})
{
"retval" : [
{
"time" : 0
}
],
"count" : 5,
"keys" : 1,
"ok" : 1
}
>