Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Underscore's Cloning of Mongoose Objects and Deleting Properties Not Working?

I'm using Mongoose and I want to remove the _id property from my Mongoose instance before I send the JSON response to the client.

Example:

var ui = _.clone(userInvite);
delete ui["_id"];
console.log(JSON.stringify(ui)); //still has "_id" property, why?

The previous didn't work.

However, if I do:

var ui = JSON.parse(JSON.stringify(userInvite)); //poor man's clone
delete ui["_id"];
console.log(JSON.stringify(ui)); //"_id" is gone! it works!

I don't understand why calling delete on a cloned object using Underscore doesn't work, but if I do the hacky JSON.string/JSON.parse, it works.

Any thoughts on this behavior?

like image 792
JP Richardson Avatar asked Feb 23 '12 18:02

JP Richardson


1 Answers

I just came across a similar issue trying to replace _id with id. Doing this worked for me:

Schema.methods.toJSON = function(options) {
  var document = this.toObject(options);
  document.id = document._id.toHexString();
  delete(document._id);
  return document;
};

Maybe it will start working if you replace delete ui["_id"] with delete ui._id or use toObject instead of _.clone.

like image 77
Ryan Ahearn Avatar answered Sep 22 '22 18:09

Ryan Ahearn