Mongoose - Better solution with appending additional information

I have two Schemas:

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' }
  }]
 }]
});

Now I want to get all Program docs, but also append 'status' to each doc, to return if the program is already in a partnership with the logged in user.


My solution looks like this:

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);
});  

The req.user object contains all information about the logged in user, including the partnerships array.

To get this solution to work, I have to append

partnership: Schema.Types.Mixed

to the ProgramSchema.

This looks a bit messy and thats why I am asking for help. What do you think?

When you want to freely modify the result of a Mongoose query, add lean() to the query chain so that the docs (programs in this case) are plain JavaScript objects instead of Mongoose doc instances.

Program.find({active: true}, 'name owner image user.payments')
  .lean()            // <= Here
  .sort({_id: -1})
  .exec(function(err, programs){ ...

Then you can remove partnership from your schema definition. Your query will also execute faster.