2014-10-01 92 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