我的mongodb数据库中有两个集合: - Users,Clubs
User Schema :-
var UserSchema = new Schema({
Name: {
type: String ,
required: true
},
Clubs: [
{type: mongoose.Schema.Types.ObjectId, ref: 'Club'}
]});
现在,当用户加入俱乐部时,我会更新俱乐部阵列。但我也经常需要获取特定俱乐部的所有用户。因此,我正在创建俱乐部架构: -
var ClubSchema = new Schema({
clubName : {
type: String ,
unique: true ,
required: true
},
members : [
{type: mongoose.Schema.Types.ObjectId,
ref: 'User' ,
default: []
} ]});
我的问题是:这是否是正确的方式,或者我应该仅在用户收藏中保留此俱乐部信息?也许我需要优化与获取属于俱乐部的所有用户相关的查询。
答案 0 :(得分:1)
很难说诚实是什么“正确的方法”,因为这很可能取决于您的应用程序查询和体系结构。
我看到有些人按照你的设计做了;通过在两个集合中使用引用来解决多对多关系。 这适用于上面的案例查询:
db.user.find({“clubs”:ObjectId(“000000”)}); #查找属于某个俱乐部的所有用户。 db.club.find({“users”:ObjectId(“111111”)}); #查找用户所属的所有俱乐部。
有两个索引:
db.user.ensureIndex({“俱乐部”:1});
db.club.ensureIndex({“users”:1});
虽然这可能会降低整体一致性。即,当您删除俱乐部时,您还需要更新其他受影响的文档。在上述更新过程中,您的文档可能不是最新的。 如果您没有在副本上使用mongodb,而不是从分布式系统访问数据库,并且您认为这个问题不是一个大问题,那么请选择此设计以便于查询。
如果您认为上述一致性是一个交易破坏者, 然后在用户集合中仅插入俱乐部参考。 这可能是最常见的设计,也是最常见的设计 mongodb官方网站。
我建议首先优化您的查询,然后再选择在更新/插入中添加复杂性(因为您必须通过在用户和俱乐部中使用ref来更新所有相关文档)。
希望这会有所帮助。