在使用MonoDB 做报表汇总经常的有去重统计总数的需求,在此总结一下实现方式:
1, 直接使用distinct 语句查询, 这种查询会将所有查询出来的数据返回给用户, 然后对查询出来的结果集求总数(耗内存,耗时一些)
var len = db.student.distinct("name",{"age" : 18}).length; print(len)
注,使用这种方法查询时,查询的结果集大于16M 时会查询失败,失败信息如下:
{"message" : "distinct failed: MongoError: distinct too big, 16mb cap","stack" : "script:1:20"}
2, 使用聚合函数,多次分组统计结果,最终将聚合的结果数返回给用户
db.student.aggregate([ {$match:{"age" : 18}}, {$project:{"name":true}}, {$group:{_id:"$name"}}, {$count:"total_count"} ]) 或者 db.student.aggregate([ {$match:{"age" : 18}}, {$project:{"name":true}}, {$group:{_id:"$name",total_count:{$sum:1}}} ])
注,这种查询数据量大时就不会出现如上查询失败的情况,而且这种查询不管是内存消耗还是时间消耗都优于上面一种查询.