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

MongoDB:调用Count()与跟踪集合中的计数,mongodb,performance,mongodb-.net-driver,Mongodb,Performance,Mongodb .net Driver,我正在将我们的消息传递系统移动到MongoDB,我想知道对于各种统计数据,如每个用户的消息数等,应该采取什么方法。在MS SQL数据库中,我有一个表,其中每个用户有不同的计数,它们通过对应表上的触发器进行更新,例如,我可以在不调用昂贵的selectcount(*)操作的情况下知道UserA有多少未读消息 MongoDB中的count函数也很昂贵吗? 我开始阅读关于map/reduce的文章,但是我的站点负载很高,所以统计数据必须实时更新,我的理解是map/reduce是一个耗时的操作 在Mong

我正在将我们的消息传递系统移动到MongoDB,我想知道对于各种统计数据,如每个用户的消息数等,应该采取什么方法。在MS SQL数据库中,我有一个表,其中每个用户有不同的计数,它们通过对应表上的触发器进行更新,例如,我可以在不调用昂贵的
selectcount(*)
操作的情况下知道UserA有多少未读消息

MongoDB中的
count
函数也很昂贵吗? 我开始阅读关于map/reduce的文章,但是我的站点负载很高,所以统计数据必须实时更新,我的理解是map/reduce是一个耗时的操作


在MongoDB中收集各种聚合计数的最佳(性能方面的)方法是什么?

如果您有大量数据,那么我会坚持使用相同的方法,并在为用户添加新消息时增加聚合计数器,使用如下集合:

计数

{
    userid: 123,
    messages: 10
}
不幸的是(或幸运的是?)MongoDB中没有触发器,因此您需要从应用程序逻辑中增加计数器:

db.counts.update( { userid: 123 }, { $inc: { messages: 1 } } )
这将为您提供最佳性能,您可能还需要在
userid
字段上添加索引,以便快速查找:

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

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