MongoDB:调用Count()与在集合中跟踪计数的区别

8
我正在将我们的消息系统迁移到MongoDB,并且想知道在处理各种统计数据时应采取什么方法,例如每个用户的消息数量等。在MS SQL数据库中,我有一个表格,其中包含每个用户的不同计数,并通过相应表格上的触发器进行更新,因此我可以知道UserA有多少未读消息,而无需调用昂贵的SELECT Count(*)操作。
在MongoDB中,count函数是否也很昂贵?我开始阅读有关map/reduce的文章,但我的网站负载很高,因此统计数据必须实时更新,我了解到map/reduce是耗时操作。
在MongoDB中收集各种聚合计数的最佳(性能方面)方法是什么?
2个回答

6
如果你有大量的数据,那么我建议你使用相同的方法,为每个用户添加新消息时递增聚合计数器,使用类似以下集合的方式: counts
{
    userid: 123,
    messages: 10
}

不幸的是(或者幸运的是?),MongoDB中没有触发器,所以您需要从应用程序逻辑中增加计数器:

db.counts.update( { userid: 123 }, { $inc: { messages: 1 } } )

这样做可以获得最佳性能,您还可以为userid字段建立索引以进行快速查找:

db.counts.ensureIndex( { userid: 1 } )

4

Mongodb非常适合数据反规范化。如果您的网站负载很高,那么几乎需要预先计算所有内容,因此使用$inc来增加消息计数是毫无疑问的。


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