Undercore's克隆Mongoose对象和删除不起作用的属性

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

本文关键字:删除 不起作用 属性 对象 Mongoose 克隆 Undercore      更新时间:2023-09-26

我正在使用Mongoose,在向客户端发送JSON响应之前,我想从Mongoose实例中删除_id属性。

示例:

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!

我不明白为什么使用Undercore在克隆的对象上调用delete不起作用,但如果我使用破解的JSON.string/JSON.parse,它就会起作用。

对这种行为有什么看法吗?

我刚刚遇到一个类似的问题,试图用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,也许它会开始工作。

在前面的答案基础上,还有一种方法可以实现同样的结果toObject'函数将转换应用于schema.options.toObject.transform函数定义的文档,例如

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