2017-03-29 10 views
0

現在、私はそれらを使う場所によって異なるファイルで異なるモデルを定義していますが、それらの間には関係があると思います。最初。例:モンゴース人口を使ってモデルを結合する方法

ファイル 'モデル/ 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が、中例はすべて1つのファイルにあります。私は他のモデルへの呼び出しがエラーをスローするように保守性(と私の正気)のためにモデルを別々に保つことを試みています。

私はこれを行うことができるように、モデルに参加するか、他の外部モデルを参照する方法はありますか?スキーマは正しいですか?...

私はエクスプレスとモンゴースを使用しています。修正は非常に簡単です、

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

おかげ参考

答えて

0

あなたはユーザーモデルで会社の参照を保存することができますので、詳細をフェッチしている間にあなたにも、会社の詳細情報を取得することができます。異なるファイルにあるモデルは違いはありません。

変更ユーザモデルのデータ型は、オブジェクトIDとrefフィールドがそうのような正しいモデル参照されるように:最後に

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

本当に簡単:

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

し、それを使用します..

関連する問題