8

我正在将我们的消息传递系统移动到 MongoDB,并且很好奇针对各种统计数据采取什么方法,例如每个用户的消息数量等。在 MS SQL 数据库中,我有一个表,其中每个用户有不同的计数,它们通过触发器进行更新在相应的表上,因此我可以知道 UserA 有多少未读消息,而无需调用昂贵的SELECT Count(*)操作。

countMongoDB 中的函数是否也很昂贵?我开始阅读有关 map/reduce 的信息,但我的网站负载很高,因此必须实时更新统计信息,我的理解是 map/reduce 是耗时的操作。

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

4

2 回答 2

5

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

计数

{
    userid: 123,
    messages: 10
}

不幸的是(或幸运的是?)MongoDB 中没有触发器,因此您将从应用程序逻辑中增加计数器:

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

这将为您提供最佳性能,并且您可能还会在该userid字段上放置一个索引以进行快速查找:

db.counts.ensureIndex( { userid: 1 } )
于 2011-05-19T06:13:15.523 回答
4

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

于 2011-05-19T07:16:43.620 回答