如何解决MongoDB中的“Digg”问题

时间:2010-05-12 22:19:00

标签: java mongodb join nosql

前段时间,一位Digg开发者发布了这个博客“http://about.digg.com/blog/looking-future-cassandra”,其中他描述了一个在MySQL中没有得到最佳解决的问题。这被认为是他们搬到卡桑德拉的原因之一。

我一直在玩MongoDB,我想了解如何

为此问题实现MongoDB集合

从文章中,MySQL中此信息的架构:

CREATE TABLE `Diggs` (
  `id`      INT(11),
  `itemid`  INT(11),
  `userid`  INT(11),
  `digdate` DATETIME,
  PRIMARY KEY (`id`),
  KEY `user`  (`userid`),
  KEY `item`  (`itemid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Friends` (
  `id`           INT(10) AUTO_INCREMENT,
  `userid`       INT(10),
  `username`     VARCHAR(15),
  `friendid`     INT(10),
  `friendname`   VARCHAR(15),
  `mutual`       TINYINT(1),
  `date_created` DATETIME,
  PRIMARY KEY                (`id`),
  UNIQUE KEY `Friend_unique` (`userid`,`friendid`),
  KEY        `Friend_friend` (`friendid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这个问题在社交网络场景实现中无处不在。人们与很多人交往,他们反过来挖掘了很多东西。快速向用户展示他/她的朋友所做的事情是非常关键的。

据我所知,自那时以来,有几个博客提供了一个纯RDBM解决方案,其中包含针对此问题的索引。但我很好奇如何在MongoDB中解决这个问题。

2 个答案:

答案 0 :(得分:1)

这样做的一种方法是在每个帖子中添加一个“朋友”数组。

{
  date: Date(...)
  friends: ['me', 'you', 'thatguy']
  ...
}
db.posts.ensureIndex({friends:1, date:-1})

然后你可以通过这样做轻松地显示我的页面: db.posts.find({friends:'me'}).sort({date:-1})

只要每个用户的朋友少于约200,000,这将有效;您可能需要来自具有更多内容的用户的特殊情况帖子。一种方法是将朋友列表拆分为多个100,000块,并在每个块中输入一个

答案 1 :(得分:1)

mongo有许多可能的解决方案。您仍然可以将diggs存储在顶级表(a.k.a.集合)中,就像关系数据库一样,但另外可以将diggs存储为项集合或用户集合中的数组。类似地,友元关系可以在正向或反向方向上保存为用户集合中的数组。

最直接的方法可能是项目中的一系列diggs,以及用户中的一系列朋友。然后,一个简单的索引查询来检索用户的朋友,然后对索引的items.diggs.userid字段进行“in”查询。

Mongo自己的$in operator文档实际上使用了这个例子。