Underscore клонирование объектов Mongoose и удаление свойств не работает? - PullRequest
8 голосов
/ 23 февраля 2012

Я использую Mongoose и хочу удалить свойство _id из своего экземпляра Mongoose перед отправкой ответа JSON клиенту.

Пример:

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

предыдущий не сработал.

Однако, если я это сделаю:

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

Я не понимаю, почему вызов delete для клонированного объекта с использованием Underscore не работает, но еслиЯ делаю хакерский JSON.string / JSON.parse, это работает.

Есть мысли об этом поведении?

Ответы [ 2 ]

6 голосов
/ 09 августа 2012

Я только что столкнулся с подобной проблемой, пытаясь заменить _id на id. Это помогло мне:

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

Возможно, он начнет работать, если вы замените delete ui["_id"] на delete ui._id или будете использовать toObject вместо _.clone.

0 голосов
/ 19 мая 2014

Просто, чтобы добавить к предыдущему ответу, есть еще один способ добиться того же. Функция toObject применяет преобразование к документу, которое определяется функцией schema.options.toObject.transform, например,

schema.options.toObject.transform = function(doc, ret) {
    ret.id = doc._id;
    delete ret._id;
};
...