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

我正在使用Mongoose,我想从我的Mongoose实例中删除_id属性,然后将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! 

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

有关这种行为的任何想法?

我刚刚遇到了一个类似的问题,试图用idreplace_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; };