我为每个连接到数据库的用户创建了一个动态集合,因此集合名称为{userID} - {collection_name}。 对于每个模型,我正在导出返回像这样的
的猫鼬模型的函数module.exports = function (userId) {
return mongoose.model(
'Device',
DeviceSchema,
userId + '-' + config.collection_names.device);
}
在我开始引用模式之前,一切正常。我的DeviceSchema
var DeviceSchema = new Schema(
{
_id: {type: String, required: true, index: true},
name: {type: String, required: true},
sensors: [{type: String, ref: 'Sensor'}]
}
);
现在,当我想找到填充了传感器的用户设备时
var devices = yield models.Device(userId).find({}).populate('sensors').exec()
我当然得到了MissingSchemaError
MissingSchemaError: Schema hasn't been registered for model "Sensor".
我知道我必须在引用之前注册所有模式,但尝试为每个请求加载模式看起来有点奇怪,例如像
try {
var devices = yield models.Device(userId).find({}).populate('sensors').exec()
}
catch {
models.Sensor(userId);
var devices = yield models.Device(userId).find({}).populate('sensors').exec()
}
我担心这种方法不适合最佳实践,我不确定它是如何表现明智的。 那我该怎么设计这样的东西呢?是否可以通过集合名称中的前缀来区分“用户”数据库?