mongoose多租户 – 处理文档引用+填充

我读过一堆关于Mongoose / MongoDB中的多租户设置选项。 选项是:

  1. 分开数据库。 由于每个数据库实例的开销,这是一个“否”
  2. 同一数据库中的前缀集合 – 我将拥有共享相同模式的tenant1_Productstenant2_Products
  3. 带有参考文件的标准馆藏。

看起来#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属性,以保持它在租赁范围内。