目前我根据我使用它们的位置在不同的文件中定义不同的模型,但它们之间存在关系,我发现自己不断地获取一个,然后另一个使用第一个ID。 E.g:
档案'models / users.js'
var mongoose = require('mongoose');
var db = mongoose.connection;
var UserSchema = mongoose.Schema({
// fields
companyId: {
type: String
}
});
var User = module.exports = mongoose.model('User', UserSchema);
module.exports.getUserById = function(id, callback){
User.findById(id, callback);
}
档案'models / company.js'
var mongoose = require('mongoose');
var db = mongoose.connection;
var CompanySchema = mongoose.Schema({
// fields
});
// module export and functions etc.
因此,在该示例中,User companyId是其中一家公司的ID。然后在我的路线中,我将导入两个模型,获取用户,找到公司ID,然后获取该公司数据:
var Promise = require('bluebird');
var User = Promise.promisifyAll(require('../models/user'));
var Company = Promise.promisifyAll(require('../models/company'));
User.getUserByIdAsync()
.then(function(user){
return [user, Company.getCompanyByIdAsync(user.companyId)];
}).spread(function(user,company){
// Do stuff
}).catch(function(err)... etc });
我一直在阅读Mongoose文档中的人口数量:http://mongoosejs.com/docs/populate.html但是在示例中,所有内容都在一个文件中。我试图将模型分开以保持可维护性(以及我的理智),因此对其他模型的任何调用都会引发错误。
有没有办法加入模型或参考其他外部模型,所以我可以这样做?架构是否正确?...
我正在使用Express和Mongoose。
答案 0 :(得分:0)
您可以在用户模型中保存公司参考,因此在获取详细信息时,您也可以获取公司详细信息:
var getUserWithPopulate = function (criteria, projection, options, callback) {
Models.Users.find(criteria, projection, options).populate([
{path: 'company', select:'companyId, companyName'}
]).exec(callback);
};
由于
答案 1 :(得分:0)
作为参考,修复非常简单。不同文件中的模型没有区别。
更改用户模型,使数据类型为ObjectID,ref字段引用正确的模型,如下所示:
companyId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Company'
}
并使用它:
User.find({}).populate('companyId').exec(callback);
最后真的很简单..