我正在使用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,它可以工作。
对此行为的任何想法?
答案 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;
};