2012-02-23 70 views
8

我使用Mongoose,并且在将JSON响应发送到客户端之前,我想从我的Mongoose实例中删除_id属性。下划线的Mongoose对象克隆和删除属性不起作用?

例子:

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,但如果我做哈克JSON.string/JSON.parse,有用。

对此行为有何想法?

+0

大概是猫鼬曳你和实施'_id'作为的getter/setter而不是作为一个属性。尝试'Object.getOwnPropertyDescriptor(userInvite,“_id”)。get' – Raynos 2012-02-23 20:24:54

+0

修改任何克隆猫鼬对象的属性也是不可能的。 – Hill 2016-04-22 12:03:04

回答

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工作。

+0

我刚刚遇到了这个试图从我的用户对象中删除密码,并且为什么'delete user.password'无法正常工作而被搁置了很长一段时间。在它上使用toObject()似乎已经完成了。我的猜测是,猫鼬实际上并不是将属性存储为对象的属性,而是使用toString方法或类似方法动态构建它。 – Fapiko 2013-09-29 10:12:31

0

只是添加到以前的答案,还有一种方法来实现相同的。 “toObject”功能适用改造它是由schema.options.toObject.transform函数定义的文件,如

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