如何在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),若是有谁有好的方法,麻烦也告诉我一下,小的感激涕零啊^_^

若是您对个人技术专栏文章感兴趣并支持我继续深刻的写下去,您能够扫码支持我,毕竟英雄惜英雄嘛,无论多少我都真心的感谢您,毕竟都是对我劳动成果的承认,谢谢(^_^)。。。