我有两个模式:
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' }
}]
}]
});
现在我想获得所有程序文档,但也要附加“状态”#39;如果程序已经与登录用户合作,则返回每个文档。
我的解决方案如下:
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 。
这看起来有点乱,这就是我寻求帮助的原因。你觉得怎么样?
答案 0 :(得分:1)
如果要自由修改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
。您的查询也会执行得更快。