如何在Mongodb集合中統計去重以後的數據

比方說咱們有個Mongodb集合,


以這個簡單的集合爲例,咱們須要集合中包含多少不一樣的手機號碼,首先想到的應該就是使用distinct關鍵字,

db.tokencaller.distinct('Caller').length

若是想查看具體的而不一樣的手機號碼,那麼能夠省略後面的length屬性,由於db.tokencaller.distinct('Caller')返回的是由全部去重手機號碼組成的數組。



可是,這種方式對於全部狀況都是知足的嘛?並不如此,若是要統計的集合記錄數較大,如千萬級別的,那麼在這麼統計的時候每每會報10044錯誤,提示信息「exception : distinct too big , 16mb cap」. 後面咱們將經過其餘方式進行解決。

另一種方式可使用runCommand結合distinct進行使用,

db.runCommand({"distinct":"tokencaller","key":"Caller"})



可見在values上顯示了去重以後的手機號碼,,看結果是一個Json格式的,因而嘗試了下看看能不能取出values的大小,由於若是對於大數據量的集合來講,直接顯示去重的號碼明顯不合適,因而嘗試了下面的寫法:



發現是能夠的,因而對大數據量使用了這種方式看看是否能取出結果,發現不存在length屬性,想了想應該跟mongodb的客戶端版本有關係吧,還待驗證!!!

兩種方式都不行,因而試了下mapReduce方式,具體以下:



而後咱們會發現,他會將查詢出來的結果輸出到一個稱爲「callerstatis」的結合,以下所示:



而後使用db.callerstatis.count()就能夠知道有多少不一樣的手機號碼了。

使用這種方式,咱們一樣在大數據量的集合上試了一下,惋惜仍是失敗了!!!!(桑心T_T),若是有誰有好的方法,麻煩也告訴我一下,小的感激涕零啊^_^

若是您對個人技術專欄文章感興趣並支持我繼續深刻的寫下去,您能夠掃碼支持我,畢竟英雄惜英雄嘛,無論多少我都真心的感謝您,畢竟都是對我勞動成果的承認,謝謝(^_^)。。。