MongoDB:是有一个大的集合更好,还是有很多小的集合和连接更好?

MongoDB:是有一个大的集合更好,还是有很多小的集合和连接更好?,mongodb,meteor,Mongodb,Meteor,我有一个Meteor.users收藏。由于每个用户“类型”都有不同的配置文件,因此用户集合可能会变得相当大。这是我正在做的一个例子 { profiles: { player: "someplayerid", admin: null, battlenet: null }, roles: { "somegroupid": [ 'player' ], "someothergroupid": [ 'admin',

我有一个
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认为哪种方法更好

是有一个大的集合更好,还是有许多较小的集合与联接更好

在你的情况下,我会使用大量的收集。连接是昂贵的,因为这意味着您需要多次往返数据库,并且需要在代码中连接这些数据库

也考虑线:

  var profileIds = Roles.getUsersInRole('player', 'somegroupid').map(function (doc) {
    return doc.profiles.player;
  });
假设你有1000000名玩家。你真的想获取所有这些玩家的所有信息,去掉他们的ID,在1000000大小的内存中创建一个数组,然后将这个数组“上传”回Mongo进行另一个查询吗?这在内存和CPU方面非常昂贵


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

连接还有一个您没有提到的问题:由于MongoDB没有事务,您必须准备好让外部引用在两个查询之间消失。