2014-10-01 83 views
0

更好的解决方案,我有两个模式:猫鼬 - 用的附加信息附加

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

这看起来有点凌乱,这就是为什么我要求帮助。你怎么看?

回答

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。您的查询也会执行得更快。

+0

谢谢,我会试试看。 – BastianW 2014-10-01 13:48:26