Mongoose - 附加额外信息的更好解决方案

时间:2014-10-01 10:37:36

标签: node.js mongodb mongoose underscore.js lodash

我有两个模式:

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

这看起来有点乱,这就是我寻求帮助的原因。你觉得怎么样?

1 个答案:

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