这几天被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文档是一个{ } 哦 。
今天先到这吧,思绪有点乱了。改天整理。。。