0

我试图弄清楚 MongoDB 是否需要事务,以及为什么你不会将所有内容都放在一个文档中。我也知道 twitter 使用确实有交易的 HBase,所以我想到了一条推文和观察者。

如果我发布推文,它将毫无问题地插入。但是我或其他人如何找到我的推文?我听说 mongodb 有索引,所以也许我可以索引作者并找到我的推文,但是我无法想象如果每个人都这样做会很有效率。时间也必须被索引。

所以据我了解(我想我看到了一些推特发布的幻灯片)推特有一个“时间线”,所以每次一个人发推文时,推特都会在每个人的时间线中插入推文 ID,该时间线按日期索引,当给定用户浏览时,它会抓取可用的推文排序时间。

这将如何在 mongodb 中完成?我能想到的唯一解决方案是在推文文档中有一列写着 {SendOut:DateStamp},完成后将其删除。如果它在第一次尝试时没有完成(检查时间戳以猜测它现在是否应该完成),那么我需要检查所有观察者,看看谁没有收到它,如果没有则插入。但也因为没有交易,我想我需要索引 SendOut 列?这个解决方案行得通吗?我如何有效地插入推文并将其提供给所有观看用户的人?(如果此解决方案不起作用)

4

1 回答 1

0

听起来您正在描述类似于 pub/sub 的模型。你不能用用户最后阅读的每个用户对象来跟踪最后一篇文章(按日期)吗?用户会以相同的方式请求推文,使用包括时间在内的各种索引。

我不确定您需要交易做什么,但 Mongo 确实支持原子操作。

[更新]

所以换句话说,每个用户的对象都存储了最后一条推文读取/发送的日期时间。显然,您还需要订阅作者 ID 的列表。要获取新的推文,你会要求由 author_id、time 属性索引的推文,然后按时间排序。

通过使用用户对象的最后读取日期并将其用作推文集合的二级索引,我认为您不需要发布/订阅或事务来执行此操作。

不过,我可能会遗漏一些东西。

于 2012-10-10T20:57:45.550 回答