在使用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"}},{$group:{_id:null,count:{$sum:1}}}
])
注,這種查詢數據量大時就不會出現如上查詢失敗的情況,而且這種查詢不管是內存消耗還是時間消耗都優于上面一種查詢.
原文參見個人博客:http://www.xuexiyuan.cn/article/detail/148.html