37

I am returning a Mongoose document and wish to add some meta data to it before I send it off. I am however unable to add any properties and I am not sure why. I have checked that it is extensible with Object.isExtensible(doc) and it is.

Item.findById(req.params.id).exec(function(err, doc) {
   doc.blah = 'hello';
   console.log(doc); // No trace of 'blah'. I can change/delete existing props however
})

What could be issue?

cyberwombat
  • 38,105
  • 35
  • 175
  • 251

1 Answers1

77

Ah.. My object is a Mongoose document which doesn't allow adding properties. The solution is to either convert the returned document to a plain object or to call lean() in the query.

Item.findById(req.params.id).exec(function(err, doc) {
  var obj = doc.toObject();
  ...
});

Item.findById(req.params.id).lean().exec(function(err, doc) {      
  ...
});
cyberwombat
  • 38,105
  • 35
  • 175
  • 251
  • does converted plain object have schema methods? – irakli2692 Jun 13 '17 at 08:46
  • Bingo! Thank you so much. Stuck at figuring it out! – Woppi Mar 16 '18 at 08:22
  • 3
    @irakli2692 In simple terms, no, you don't. toObject, toJSON and toString strips all the mongoose related information from the document leaving behind just the schema information. So, you won't have access to schema methods. – Ozil Jul 15 '18 at 09:13