我正在将我们的消息系统移动到MongoDB,并且很好奇对于各种统计数据采取什么方法,例如每个用户的消息数量等等。在MS SQL数据库中,我有一个表,其中每个用户有不同的计数,他们得到通过相应表上的触发器更新,因此我可以例如知道UserA有多少未读消息而不调用昂贵的SELECT Count(*)
操作。
MongoDB中的count
函数是否也很昂贵?
我开始阅读有关map / reduce的内容,但我的网站负载很高,所以统计数据必须实时更新,我的理解是map / reduce是耗时的操作。
在MongoDB中收集各种聚合计数的最佳(性能方面)方法是什么?
答案 0 :(得分:4)
如果您有大量数据,那么每当为用户添加新消息时,我都会坚持使用相同的方法并增加聚合计数器,使用类似这样的集合:
<强>计数强>
{
userid: 123,
messages: 10
}
不幸的是(或幸运的是?)MongoDB中没有触发器,所以你要从你的应用程序逻辑增加计数器:
db.counts.update( { userid: 123 }, { $inc: { messages: 1 } } )
这将为您提供最佳性能,并且您可能还会在userid
字段上放置一个索引以进行快速查找:
db.counts.ensureIndex( { userid: 1 } )
答案 1 :(得分:4)
Mongodb非常适合数据非规范化。如果您的网站负载很高,那么您需要预先计算几乎所有内容,因此请毫无疑问地使用$inc
来增加邮件数量。