下划线克隆Mongoose对象和删除属性不起作用?

时间:2012-02-23 18:28:49

标签: javascript node.js clone mongoose underscore.js

我正在使用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!

我不明白为什么使用Underscore在克隆对象上调用delete不起作用,但是如果我使用hacky JSON.string / JSON.parse,它可以工作。

对此行为的任何想法?

2 个答案:

答案 0 :(得分:6)

我刚刚遇到类似的问题,试图用_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,它可能会开始有效。

答案 1 :(得分:0)

只是添加到上一个答案,还有一种方法可以实现相同的目标。 ' toObject'函数将转换应用于由schema.options.toObject.transform函数定义的文档,例如

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