MongoDB:拥有大型集合或带有连接的小型集合是否更好?

时间:2015-06-01 16:58:55

标签: mongodb meteor

我有一个Meteor.users集合。由于每个用户"键入"有不同的配置文件,用户集合可以变得相当大。这是我正在做的一个例子。

{
  profiles: {
    player: "someplayerid",
    admin: null,
    battlenet: null
  },
  roles: {
    "somegroupid": [
      'player'
    ],
    "someothergroupid": [
      'admin',
      'player'
    ]
  }
}

然后在我的查询中,我正在进行伪连接以查询组,角色和配置文件。例如:

Meteor.publish('players', function () {
  // all _ids of those with role "player" in "somegroupid"
  var profileIds = Roles.getUsersInRole('player', 'somegroupid').map(function (doc) {
    return doc.profiles.player;
  });

  return Players.find({
    _id: {
      $in: profileIds
    }
  })
});

在这种情况下,简单地将对象直接添加到Meteor.users集合中是否更好?在mongo文档中,它说:

  

写入时加入,而不是读取

mongodb认为哪种方法更好?

1 个答案:

答案 0 :(得分:2)

  

最好是拥有一个大型集合,还是许多带有连接的小集合?

在你的情况下,我会使用大型集合。连接很昂贵,因为这意味着您需要多次往返数据库,以及需要在代码中加入这些连接。

还要考虑以下几行:

  var profileIds = Roles.getUsersInRole('player', 'somegroupid').map(function (doc) {
    return doc.profiles.player;
  });

想象一下,你有1,000,000名玩家。你真的想要获取有关所有这些播放器的所有信息,删除它们的ID,在内存中创建一个大小为1000000的数组,然后上传"这个数组回到Mongo进行另一次查询?这在内存和CPU方面非常昂贵。

使用大型集合,您只需要创建一个查询,然后迭代该查询的游标响应(非常高效的内存)。