MongoDB分组统计的一个例子

这几天被MongoDB整疯了。

算是对MongoDB有了进一步的了解,还是有很多坑等着去探索。

一个是关于MongoDB中Int64 Int32 Double三个数据类型,PHP中只有int型,那么32位系统中怎么处理的呢。

被坑之后发现:使用MongoDB PHP Driver时,如果向mongodb中insert一个数值,默认是如果这个数值一个小于等于(2^31 - 1) 那么在mongodb中存储的时候是int32存储 。但是如果这个数值大于了(2^31 -1)但是没有进行任何处理,直接使用了insert,那么在mongodb中是存储成了Double,如果想要让存储称int64 ,那么php中需要使用 new MongoInt64这个类。

那么反过来,如果mongodb中存储了一个int64的数值,使用find操作,在php中对应什么类型呢?在32位系统中,如果这个数值没有超过2^31那么正常就是一个int,如果超了,额……报出一个异常…!!叫什么MongoCursorException。很无奈吧。。

然后说说关于mongo中分组统计这个问题。

一般来说mongo中如果做分组统计,我有三个方法,一个aggregate  一个 group  然后就是直接上mapreduce

aggregate和group返回分组的结果,mapreduce的话,会将结果输出到一个临时集合里,需要再去查这个集合

前面两个用过,mapreduce目前还没试过。看资料和group的用法差不多。

先说aggregate,需要提到管道的概念,就是一节一节的管道,文档从这一节一节管道中过滤,最终得到想要的结果

一般是先用{"$match":{}} 过滤一下,相当于sql中的where条件,然后可能需要{"$project":{}} 需要对文档进行一个初步的整理,删除,添加,修改一些字段(属性) 然后就是最终要的{"$group":{}} $group中一般是

 { "$group" : { "_id" : { "citycode":"$citycode" , "uid" : "$uid"  } , "count":{ "$sum" : 1 } } } 

以citycode和uid分组,相当于sql中group by citycode , uid 经过这个之后,文档就只剩下了 citycode  uid  count 这三个字段了

可以使用多个$goup。

group这个命令,db.collection_name.group()  首先是 key 或者是keyf  就是相当于分组  key比较简单

key : "citycode" 就是以citycode进行分组   

keyf可以复杂一点   keyf : function(doc){ return { "citycode":doc.citycode , "uid": doc.uid} ;}

这里的doc是所有的文档,使用citycode和uid进行分组,结果就是分好组的文档,所有文档还是存在的

在 reduce:function Rdeuce(doc , out){ } 可以理解就是将一组的文档传进来进行循环,输出一个out文档。out文档是一个{ } 哦 。

今天先到这吧,思绪有点乱了。改天整理。。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值