Java 如何解决这个问题;Digg";MongoDB中的问题

Java 如何解决这个问题;Digg";MongoDB中的问题,java,mongodb,join,nosql,Java,Mongodb,Join,Nosql,不久前,一位Digg开发人员发布了这篇博客,“,他在博客中描述了MySQL无法最佳解决的一个问题。这是他们搬到卡桑德拉的原因之一 我一直在玩MongoDB,我想了解如何使用它 为此问题实现MongoDB集合 在本文中,MySQL中此信息的模式为: CREATE TABLE `Diggs` ( `id` INT(11), `itemid` INT(11), `userid` INT(11), `digdate` DATETIME, PRIMARY KEY (`id

不久前,一位Digg开发人员发布了这篇博客,“,他在博客中描述了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;
这个问题在社交网络场景实现中普遍存在。人们结交了很多人,他们反过来又挖掘了很多东西。快速向用户展示他/她的朋友在做什么是非常关键的


据我所知,从那以后,有几个博客为这个问题提供了一个纯RDBMs解决方案和索引;然而,我很好奇如何在MongoDB中解决这个问题。

一种方法是在每个帖子中添加一组“朋友”

{
  date: Date(...)
  friends: ['me', 'you', 'thatguy']
  ...
}
db.posts.ensureIndex({friends:1, date:-1})
然后,您可以通过执行以下操作轻松显示我的页面:
db.posts.find({friends:'me}).sort({date:-1})


只要每个用户的好友少于200000人,这项功能就可以发挥作用;您可能需要从具有以上内容的用户处获取特例帖子。一种方法是将好友列表拆分为100000个区块,并为每个区块创建一个post条目

mongo有许多可能的解决方案。您仍然可以像关系数据库一样将diggs存储在顶级表(也称为集合)中,但还可以将diggs作为数组存储在项集合或用户集合中。类似地,朋友关系可以在用户集合中以正向或反向的方式保留为数组

最直接的方法可能是在项目中添加一组diggs,在用户中添加一组好友。然后,检索用户朋友的简单索引查询后面是index items.diggs.userid字段上的“in”查询


Mongo自己的文档实际上使用了这个示例。

我假设在您的示例中,“friends”是对其他用户的引用数组。我假设用户存储在用户集合中,“friends”数组只是对用户集合中用户的引用列表。所以,如果我想找到我朋友的所有帖子,那么我就不必“加入”了吗?(我很抱歉使用诸如连接等术语,因为我来自SQL背景)Friends应该是您在用户对象中用作_id的任何内容的数组。这可以是字符串或ObjectID;两者都有优点和缺点。我不会做加入或类似加入的手术。相反,只需将当前用户的_id存储在cookie或会话对象中。然后用当前用户的_id替换我的示例查询中的字符串“me”,它将执行您想要的操作。默认情况下,如果在查询中使用单个值查询和数组字段,mongo将检查查询值是否在数组中。谢谢!!我会尝试这个解决方案。对于Digg来说,“in”查询是个问题。好友列表来自MemCached,他们执行了一个“In”查询,这是一个瓶颈。(根据我使用'in'SQL的经验,这不是优化的查询方式)根据您的经验,$in运算符的性能如何,假设在“in”集中使用了大约50个值。