我是nodejs的新手。 我有一个mongoose和用户登录的应用程序。 mongoDB中的一些集合适用于所有用户,有些像例如客户集合是个体的,因此所有用户都拥有自己客户的集合。 当用户登录并获取他的jwt-token时,将实例化各个猫鼬模型:
var models = require('../models')(userID);
在文件夹/ models中有一个index.js:
var Customer = require('./customermodel');
module.exports = function (userID) {
Customer(userID)
}
文件/models/customermodel.js:
var mongooseCustomer = function(userID) {
var schema = mongoose.Schema({
_id: { type: Number},
Name: { type: String },
Address: { type: String },
}, {collection: userID + 'userID'})
return mongoose.model(userID + 'customer', schema);
}
Module.exports = mongooseCustomer;
当客户从两个不同的浏览器登录并返回错误时,会出现此问题:
编译后无法覆盖123customer
模型。
我通过改变解决了这个问题:
var models = require('../models')(userID);
为:
try {
var models = require('../models')(userID);
console.log('Schema was created');
}
catch (err) {
console.log('User is already logged in');
}
现在我的问题是整个设置是否过于复杂,是否有更简洁的方式来处理以动态方式创建模型?
答案 0 :(得分:3)
如果您真的想坚持为用户动态创建集合,那么如果已经为用户编译了模型,则try{ } catch(err)
更好的方法是查询mongoose。 mongoose.model
函数可用于定义和检索模型:
var mongooseCustomer = function(userID) {
var model = mongoose.model(userID + 'customer');
if (!model) {
var schema = mongoose.Schema({
_id: { type: Number},
Name: { type: String },
Address: { type: String },
}, {collection: userID + 'userID'});
model = mongoose.model(userID + 'customer', schema);
}
return model;
};
Module.exports = mongooseCustomer;
我希望您为每个用户动态创建集合的方法不会扩展,因为mongoose不是为处理第1000个模型而构建的,并且Mongodb具有最大集合限制,因为大多数数据库都有。
恕我直言,更好的方法可能是在馆藏中使用鉴别器来识别租户并公开数据库层以透明的方式处理租户。
让我们定义一个暴露最小数据层的模型node.js模块
// First define the schema and model
var customerSchema = mongoose.Schema({
_id: { type: Number},
// Additional tenant discriminator
userID: { type: Number, required: true },
Name: { type: String },
Address: { type: String },
});
var customerModel = mongoose.model('customer', schema);
module.exports = function(userID) {
return {
customer: {
find: function(query, callback) {
query.userID = userID;
customerModel.find(query, callback);
},
findOne: function(callback) {
var query = { userID : userID };
customerModel.findOne(query, callback);
}
}
}
}
使用此最小图层时,请确保始终将userID添加到Mongodb函数中。
var models = require('../models')(123124432);
models.customer.findOne(...);
您还可以使用以透明方式处理多租户的mongoose中间件(http://mongoosejs.com/docs/middleware.html),而不是在mongoose之上定义您自己的数据层。