我有一个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认为哪种方法更好?
答案 0 :(得分:2)
最好是拥有一个大型集合,还是许多带有连接的小集合?
在你的情况下,我会使用大型集合。连接很昂贵,因为这意味着您需要多次往返数据库,以及需要在代码中加入这些连接。
还要考虑以下几行:
var profileIds = Roles.getUsersInRole('player', 'somegroupid').map(function (doc) {
return doc.profiles.player;
});
想象一下,你有1,000,000名玩家。你真的想要获取有关所有这些播放器的所有信息,删除它们的ID,在内存中创建一个大小为1000000的数组,然后上传"这个数组回到Mongo进行另一次查询?这在内存和CPU方面非常昂贵。
使用大型集合,您只需要创建一个查询,然后迭代该查询的游标响应(非常高效的内存)。