<p class="intro">比方说我们有个Mongodb集合, 以这个简单的集合为例,我们需要集合中包含多少不同的手机号码,首先想到的应该就是使用distinct关键字, db.tokencaller.distinct('Caller').length 如果想查看具体的而不同的手机号码,那么可以省略后面的length属性,因为 db</p> <span >比方说我们有个Mongodb集合,</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><img src="http://img.blog.csdn.net/20160507193523691?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br style="max-width:90%"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">以这个简单的集合为例,我们需要集合中包含多少不同的手机号码,首先想到的应该就是使用distinct关键字,</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">db.tokencaller.distinct('Caller').length</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">如果想查看具体的而不同的手机号码,那么可以省略后面的length属性,因为<span style="color:#000000; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left">db.tokencaller.distinct('Caller')返回的是由所有去重手机号码组成的数组。</span></span> <span style="font-family:Microsoft YaHei; font-size:18px; color:#000000; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><img src="http://img.blog.csdn.net/20160507193606239" alt=""><br> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">但是,这种方式对于所有情况都是满足的嘛?并不如此,如果要统计的集合记录数较大,如千万级别的,那么在这么统计的时候往往会报10044错误,提示信息“exception : distinct too big , 16mb cap”. 后面我们将通过其他方式进行解决。</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">另外一种方式可以使用runCommand结合distinct进行使用,</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">db.runCommand({"distinct":"tokencaller","key":"Caller"})</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><img src="http://img.blog.csdn.net/20160507193615348" alt=""><br> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">可见在values上显示了去重之后的手机号码,,看结果是一个Json格式的,于是尝试了下看看能不能取出values的大小,因为如果对于大数据量的集合来说,直接显示去重的号码明显不合适,于是尝试了下面的写法:</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><img src="http://img.blog.csdn.net/20160507193621942" alt=""><br> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">发现是可以的,于是对大数据量使用了这种方式看看是否能取出结果,发现不存在length属性,想了想应该跟mongodb的客户端版本有关系吧,还待验证!!!</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">两种方式都不行,于是试了下mapReduce方式,具体如下:</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><img src="http://img.blog.csdn.net/20160507193626864" alt=""><br> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">然后我们会发现,他会将查询出来的结果输出到一个称为“callerstatis”的结合,如下所示:</span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><img src="http://img.blog.csdn.net/20160507193632169" alt=""><br> </span> <span style="font-family:Microsoft YaHei; font-size:18px"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px">然后使用db.<span style="color:#000000; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left">callerstatis.count()就可以知道有多少不同的手机号码了。</span></span> <span style="font-family:Microsoft YaHei; font-size:18px; color:#000000; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left"><br style="background-color:inherit"> </span> <span style="font-family:Microsoft YaHei; font-size:18px; color:#000000; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left">使用这种方式,我们同样在大数据量的集合上试了一下,</span><span style="font-family:Microsoft YaHei; font-size:18px; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left"><span style="color:#ff0000; background-color:inherit">可惜还是失败了</span></span><span style="font-family:Microsoft YaHei; font-size:18px; color:#000000; background-color:rgb(255,255,255); font-style:normal; font-weight:normal; text-align:left">!!!!(桑心T_T),如果有谁有好的方法,麻烦也告诉我一下,小的感激不尽啊^_^</span>