2017-03-29 4 views
0

현재 내가 사용하는 위치에 따라 다른 파일에서 다른 모델을 정의하려고합니다. 그러나 그들 사이에는 관계가 있습니다. 그래서 나는 계속해서 하나를 가져오고, 다른 하나는 먼저. 예 :Mongoose Population을 사용하여 모델을 결합하는 방법

파일 '모델/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); 
} 

파일 '모델/company.js'

var mongoose = require('mongoose'); 
var db = mongoose.connection; 
var CompanySchema = mongoose.Schema({ 
    // fields 
}); 
// module export and functions etc. 

그래서 예에서 사용자 회사 ID는 하나의 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 }); 

내가 여기 몽구스의 문서에 인구에 대해 읽어 봤는데 : http://mongoosejs.com/docs/populate.html하지만의를 모든 것이 하나의 파일에 들어 있습니다. 다른 모델에 대한 호출이 오류를 던질 수 있도록 유지 보수성 (및 제 정신성)을 위해 모델을 별도로 유지하려고합니다.

모델에 참여하거나 다른 외부 모델을 참조 할 수있는 방법이 있습니까? 스키마도 맞습니까? ...

나는 익스프레스와 몽구스를 사용하고 있습니다. 수정은 아주 간단합니다,

var getUserWithPopulate = function (criteria, projection, options, callback) { 
    Models.Users.find(criteria, projection, options).populate([ 
    {path: 'company', select:'companyId, companyName'} 
    ]).exec(callback); 
}; 

감사합니다 참고로

답변

0

당신은 사용자 모델에서 회사의 참조를 저장할 수 있습니다 따라서 세부 사항을 가져 오는 동안 당신은뿐만 아니라 회사 정보를 얻을 수 있습니다. 다른 파일에있는 모델은 아무런 효과가 없습니다.

변경 사용자 모델 데이터 유형은 OBJECTID와 심판 필드 참조과 같이 올바른 모델이되도록 :

companyId: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Company' 
} 

그리고 그것을 사용 : 결국

User.find({}).populate('companyId').exec(callback); 

정말 간단합니다 ..