代码之家  ›  专栏  ›  技术社区  ›  user193116

如何解决MongoDB中的Digg问题

  •  3
  • user193116  · 技术社区  · 16 年前

    不久前,一位Digg开发人员发布了这个博客 http://about.digg.com/blog/looking-future-cassandra ,他描述了在MySQL中没有得到最佳解决的一个问题。这是他们搬到卡桑德拉的原因之一。

    我一直在玩MongoDB,我想知道如何

    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中解决这个问题。

    2 回复  |  直到 8 年前
        1
  •  1
  •   mstearn    16 年前

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

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

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

    只要每个用户拥有的好友少于200000个,这项功能就可以发挥作用;你可能需要特殊情况下的职位,从用户与更多的。一种方法是把好友列表分成10万个区块,每个区块写一篇博文

        2
  •  1
  •   A. Coady    16 年前

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

    最直接的方法可能是在项目中设置一个digg数组,在用户中设置一个朋友数组。然后,一个简单的索引查询来检索用户的朋友,然后在indexed items.diggs.userid字段上执行“in”查询。

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

    推荐文章