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文件是一個{ } 哦 。
今天先到這吧,思緒有點亂了。改天整理。。。