mongoose多租户 – 处理文档引用+填充
我读过一堆关于Mongoose / MongoDB中的多租户设置选项。 选项是:
- 分开数据库。 由于每个数据库实例的开销,这是一个“否”
- 同一数据库中的前缀集合 – 我将拥有共享相同模式的
tenant1_Products
和tenant2_Products
。 - 带有参考文件的标准馆藏。
看起来#2是缩放的最佳select,因为它允许通过前缀进行简单的分片。 所以,假设,我会实现这样的dynamic检索某个租户的模型:
tenant.methods.getModel = function(name) { return mongoose.model(this.uniqid + '_' + name); }
假设我提前为所有租户注册所有模型,并使用正确的模式,那么我可以做var productModel = myTenant.getModel('Product');
,然后从那里创build/更新。
这个问题是当你需要实现文档引用来使用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
属性dynamic(IE,一个函数)返回一个不同的集合名称取决于定义当前租户的一些variables,或者你可以保持静态,但find某种方式告诉populate
方法自动添加适当的前缀。
完成这个的最好方法是什么? 或者,与上面的选项#3一起去避免这些问题是否更有意义? 如果是这样,这是否对分片/缩放方法有影响?
对于任何对此感兴趣的人,我继续创build一个处理所有这些的包,因为我找不到现有的包。
https://www.npmjs.org/package/mongoose-multitenant
它为每个租户使用单独的集合,并根据需要编译模式,可选地修改相关文档的ref
属性,以保持它在租赁范围内。