MongoDB中的聚合

什么是聚合呢?聚合说简单点就是数据统计,数据分类。在MySQL中,我们知道,有count来统计总数,distinct去重复,等等。MongoDB中也有这个概念,这就是聚合。

MongoDB中除了基本的查询以外,还有很强大的聚合功能,其中简单的可以计算集合中的文档个数,复杂的可以用MapReduce

1.count 统计数量。

在MongoDB中可以用count来同意一个集合中的文档数量。

[php]  view plain copy
  1. use php  //使用php这个库  
  2. switched to db php  
  3. > show collections //查看这个库下面有多少个集合  
  4. blog  
  5. foo  
  6. system.indexes  
  7. user  
  8. > db.blog.count() //使用count查看blog集合中的文档数量。3个。  
  9. 3  
  10. >  
当然也可以传递查询。比如查询age=18的人数是多少,也可以。

[php]  view plain copy
  1. > db.blog.count({"title":"wowowo"}) //统计title为"wowowo"的文档的个数。为0个  
  2. 0  
  3. > db.blog.count({"title":"wowowowo"})//统计title为"wowowowo"的文档的个数,为2个。  
  4. 2  
  5. >  

2.distinct

在MongdoDB中 distinct 用来找出给定键的所有不同的值,即是去重复,使用时,必须制定集合和键。

使用distinct 必须使用runCommand( )结合的方式。db.runCommand( )以前没说过。

[php]  view plain copy
  1. > db.runCommand()   
  2. "errmsg" : "no such cmd: ""bad cmd" : { }, "ok" : 0 }  
  3. > db.runCommand({"distinct":"blog","key":"title"}) //必须制定集合和键。制定blog集合,title键。  
  4. {  
  5.         "values" : [  
  6.                 "wowowowo",  
  7.                 "okokok"  
  8.         ],  
  9.         "stats" : {  
  10.                 "n" : 3,  
  11.                 "nscanned" : 3,  
  12.                 "nscannedObjects" : 3,  
  13.                 "timems" : 15,  
  14.                 "cursor" : "BasicCursor"  
  15.         },  
  16.         "ok" : 1  
  17. }  
  18. > db.runCommand({"distinct":"blog","key":"comments"})  //制定blog集合,comments键  
  19. {  
  20.         "values" : [  
  21.                 "hao a hao a ",  
  22.                 "23224"  
  23.         ],  
  24.         "stats" : {  
  25.                 "n" : 3,  
  26.                 "nscanned" : 3,  
  27.                 "nscannedObjects" : 3,  
  28.                 "timems" : 0,  
  29.                 "cursor" : "BasicCursor"  
  30.         },  
  31.         "ok" : 1  
  32. }  
  33. > db.runCommand({"distinct":"blog","key":"time"}) //key键。  
  34. {  
  35.         "values" : [  
  36.                 ISODate("2012-01-10T03:38:45.515Z"),  
  37.                 "2011023023"  
  38.         ],  
  39.         "stats" : {  
  40.                 "n" : 3,  
  41.                 "nscanned" : 3,  
  42.                 "nscannedObjects" : 3,  
  43.                 "timems" : 0,  
  44.                 "cursor" : "BasicCursor"  
  45.         },  
  46.         "ok" : 1  
  47. }  
  48. >  

3.group

MongoDB中的group和mysql中的group分组差不多。

group做的聚合稍微复杂一些,先选定分组所依据的键,而后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。

比如有以下数据:表示股价的结合包含以千计的如下形式的文档。

[php]  view plain copy
  1. {"day":"2010/10/03","time":"10/3/2010 03:57:01 GMT-400","price":4.23}  
  2. {"day":"2010/10/04","time":"10/4/2010 11:28:34 GMT-400","price":4.27}  
  3. {"day":"2010/10/03","time":"10/3/2010 05:00:51 GMT-400","price":4.10}  
  4. {"day":"2010/10/06","time":"10/6/2010 05:27:22 GMT-400","price":4.30}  
  5. {"day":"2010/10/04","time":"10/4/2010 08:24:58 GMT-400","price":4.01}  
我们想获得介绍是每天的最后的价格表,就像这样:

[php]  view plain copy
  1. {"day":"2010/10/03","time":"10/3/2010 05:00:51 GMT-400","price":4.10}  
  2. {"day":"2010/10/04","time":"10/4/2010 11:28:34 GMT-400","price":4.27}  
  3. {"day":"2010/10/06","time":"10/6/2010 05:27:22 GMT-400","price":4.30}  

那么我们用group如何做到像这样的分组呢?

[php]  view plain copy
  1. > db.runCommand({"group":{  
  2. ... "ns":"stocks",  
  3. ... "key":"day",  
  4. ... "initial":{"time":0},  
  5. ... "$reduce":function(doc,prev){  
  6. ... if(doc.time>prev.time){  
  7. ... prev.price=doc.price;  
  8. ... prev.time=doc.time;  
  9. ... }  
  10. ... }}})  
  11. {  
  12.         "retval" : [  
  13.                 {  
  14.                         "time" : 0  
  15.                 }  
  16.         ],  
  17.         "count" : 5,  
  18.         "keys" : 1,  
  19.         "ok" : 1  
  20. }  
  21. >  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值