我在Mongoose / MongoDB中读过很多关于多租户设置选项的内容。选项包括:
tenant1_Products
和tenant2_Products
共享相同的架构。tenant
文档。似乎#2是扩展的最佳选择,因为它允许通过前缀轻松进行分片。所以,假设这样,我会实现类似的东西来动态检索某个租户的模型:
tenant.methods.getModel = function(name) {
return mongoose.model(this.uniqid + '_' + name);
}
假设我使用正确的架构提前注册所有租户的所有模型,那么我可以var productModel = myTenant.getModel('Product');
,然后从那里创建/更新。
这个问题是当您需要实现文档引用以使用Mongoose的populate
方法时。如,
var productSchema = new mongoose.Schema({
name:String,
categories:[
{
type:mongoose.Schema.Types.ObjectId,
// This will need to change to "tenant1_Category", etc
ref:'Category'
}
]
});
mongoose.model('tenant1_Product', productSchema);
tenant1.getModel('Product').find().populate('categories').exec(function(err, results) {
...
});
基本上为此你需要使ref
属性动态化(IE,一个函数)根据定义当前租户的某个变量返回不同的集合名称,或者你可以保持静态但找到一些方法告诉populate
方法自动添加适当的前缀。
实现这一目标的最佳方法是什么?或者,使用上面的选项#3来避免这些问题更有意义吗?如果是这样,那会对分片/缩放方法产生影响吗?
答案 0 :(得分:1)
对于对此感兴趣的人,我继续创建了一个处理所有这些的包,因为我找不到现有的包。
https://www.npmjs.org/package/mongoose-multitenant
它为每个租户使用单独的集合,并根据需要编译模式,可选择修改相关文档的ref
属性以使其保持在租期内。