我有一个 MongoDB 集合,其中包含超过 1,000,000 条记录。
每条记录的大小约为 20K(因此总集合大小约为 20GB)。
集合中有一个 'type' 字段(可以有大约10个不同的值)。
我想获取该集合每种类型的计数器。
同时,'type' 字段上有一个索引。
我尝试了两种不同的方法(假设使用 Python 语法):
一种简单粗暴的方法 - 对每个值使用 'count' 调用:
for type_val in my_db.my_colc.distinct('type'):
counters[type_val] = my_db.my_colc.find({'type' : type_val}).count()
使用聚合框架和'$group'语法:
counters = my_db.my_colc.aggregate([{'$group' : {'_id': '$type', 'agg_val': { '$sum': 1 } }}])
第一种方法的性能比第二种方法快了约两个数量级。看起来这与count仅运行在索引上而不访问文档有关,而$group必须逐个遍历文档。
是否有一种有效的分组查询方式,可以仅使用索引并使用聚合框架来实现#1中的性能结果?
我正在使用MongoDB 2.6.1
更新: https://jira.mongodb.org/browse/SERVER-11447 在MongoDB Jira上就此问题打开了。