如何使用猫鼬人口组合模型

时间:2017-03-29 14:31:21

标签: node.js mongodb mongoose mongoose-populate

目前我根据我使用它们的位置在不同的文件中定义不同的模型,但它们之间存在关系,我发现自己不断地获取一个,然后另一个使用第一个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。

2 个答案:

答案 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);

最后真的很简单..