写在前面:
什么是聚合呢?聚合说简单点就是数据统计,数据分类。在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 } >