猫鼬 - 用的附加信息附加
问题描述:
更好的解决方案,我有两个模式:猫鼬 - 用的附加信息附加
var ProgramSchema = new Schema({
active: Boolean,
name: String,
...
});
var UserSchema = new Schema({
username: String,
email: { type: String, lowercase: true },
...
partnerships: [{
program: { type: Schema.Types.ObjectId, ref: 'Program' },
status: { type: Number, default: 0 },
log: [{
status: { type: Number },
time: { type: Date, default: Date.now() },
comment: { type: String },
user: { type: Schema.Types.ObjectId, ref: 'User' }
}]
}]
});
现在,我想所有的程序文档,而且“状态”附加到每个文档,返回如果程序已在与登录用户建立伙伴关系。
我的解决办法是这样的:
Program.find({active: true}, 'name owner image user.payments', function (err, p) {
if(err) { return handleError(res, err); }
})
.sort({_id: -1})
.exec(function(err, programs){
if(err) { return handleError(res, err); }
programs = _.map(programs, function(program){
var partner = _.find(req.user.partnerships, { program: program._id });
var status = 0;
if(partner){
status = partner.status;
}
program['partnership'] = status;
return program;
});
res.json(200, programs);
});
的req.user对象包含登录的用户,包括合作伙伴关系阵列中的所有信息。
为了得到这个解决方案的工作,我必须
partnership: Schema.Types.Mixed
追加到ProgramSchema。
这看起来有点凌乱,这就是为什么我要求帮助。你怎么看?
答
如果您想自由修改Mongoose查询的结果,请将lean()
添加到查询链中,以便文档(本例中为programs
)是普通的JavaScript对象而不是Mongoose doc实例。
Program.find({active: true}, 'name owner image user.payments')
.lean() // <= Here
.sort({_id: -1})
.exec(function(err, programs){ ...
然后,您可以从模式定义中删除partnership
。您的查询也会执行得更快。
谢谢,我会试试看。 – BastianW 2014-10-01 13:48:26