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文檔是一個{ } 哦 。

今天先到這吧,思緒有點亂了。改天整理。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章