Mongoose multitenancy - 处理文档引用+填充

时间:2013-12-22 19:03:22

标签: node.js mongodb mongoose multi-tenant

我在Mongoose / MongoDB中读过很多关于多租户设置选项的内容。选项包括:

  1. 单独的数据库。由于每个数据库实例的开销
  2. ,这是禁忌
  3. 同一数据库中的前缀集合 - 我将tenant1_Productstenant2_Products共享相同的架构。
  4. 标准集合,其引用返回tenant文档。
  5. 似乎#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来避免这些问题更有意义吗?如果是这样,那会对分片/缩放方法产生影响吗?

1 个答案:

答案 0 :(得分:1)

对于对此感兴趣的人,我继续创建了一个处理所有这些的包,因为我找不到现有的包。

https://www.npmjs.org/package/mongoose-multitenant

它为每个租户使用单独的集合,并根据需要编译模式,可选择修改相关文档的ref属性以使其保持在租期内。