在mongoDB中计算不同值的数量

4
这是MongoDB的文档结构。
{ "_id" :ObjectId("9elesdf3lk3jppefll34d210"), "category" :"data1",product:'data'}
{ "_id" :ObjectId("9elesdf3lk3jppefll34d211"), "category" : "data2",product:'data'}
{ "_id" :ObjectId("9elesdf3lk3jppefll34d211"), "category" : "data1",product:'data' }

其中category已建立索引。我想对category字段进行不同值的计数。

目前,我正在使用以下代码进行计数:

db.collection.aggregate( 
   {$group : {_id : "$category"} }, 
   {$group: {_id:1, count: {$sum : 1 }}})

这个查询一开始可以正确地给出计数,但是随着数据库的不断增长,查询执行时间越来越长。是否有其他更快的方法来获取计数?


3
你是否尝试过使用db.collection.distinct('category').length来替代?distinct可以使用索引,但$group不能。 - JohnnyHK
@JohnnyHK 我有超过1000万个文档并且还在增长..它能一次处理这么多数据吗? - mikhil mohanan
只要能使用索引,当然可以。大概有多少个不同的类别? - JohnnyHK
@mikhilmohanan 你应该在未来需要SO用户的帮助时开始接受答案,因为有8个问题来自你,都有答案,但你没有接受任何一个... - DAXaholic
@DAXaholic 谢谢您的评论。我会在未来注意的。 - mikhil mohanan
1个回答

3
JohnnyHK所指出的,如果可能的话,请使用db.collection.distinct,因为它提供了利用索引的机会

因此,在您的情况下,db.collection.distinct('category').length应该非常快。
如果您仍然遇到性能问题,请查看

db.collection.explain().distinct('category')  

查看查询的执行计划并对其进行操作,或将其提供给此问题,以便我们查看您的索引是否实际使用。


我已经执行了查询..你能帮我确定哪个字段指定了我的索引是否被使用吗? - mikhil mohanan
如果您执行..explain().distinct('category'),那么您应该在queryPlanner.winningPlan下看到'DISTINCT_SCAN'阶段。如果您看到'COLLSCAN'阶段,则表示未使用索引。 - DAXaholic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接