"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

node.js x mongoose でリレーション(コレクション間のjoin)(populate)方法



スポンサーリンク

mongooseではテーブル(コレクション)のリレーションを持つ形でデータをRDBMSのように管理できます。

[リレーションのイメージ]
f:id:azumami:20151227215937p:plain


[モデルの定義]

// グールプというコレクション
var GroupSchema = new mongoose.Schema({
    name           : String,
    member         : [MemberSchema]
 //memberスキーマとのリンク
},{collection: 'group'});

exports.Group = db.model('Group', GroupSchema);

// グールプのメンバー情報というコレクション(グループの組み込みドキュメント)
var MemberSchema = new mongoose.Schema({
    email          : String,
    role           : { type: Schema.Types.ObjectId,  ref: 'Role'}
//roleとジョインする旨の定義(実際roleエントリの_idが入る
},{collection: 'member'});

exports.Member = db.model('Member', MemberSchema);

// メンバーの権限を保持しているロールコレクション
var RoleSchema = new mongoose.Schema({
    name           : String,
    auth           : String
},{collection: 'role'});

exports.Role = db.model('Role', RoleSchema);


find、populationの仕方

Group.findOne({ "_id": req.body.id }, function(err, group){
	if(err){
		console.log(err);
	}else{
  		var options = {
  			path : 'member.role',
  			model : 'Role' 
		};
  		Member.populate(group,options,function(err,group_with_members_role){
  			if(err){
				console.log(err);
  			}else{
                                res.send(group_with_members_role);
		        }
  		});
	}
});

f:id:azumami:20151222115725p:plain