2012-02-23 24 views
8

Tôi đang sử dụng Mongoose và tôi muốn xóa thuộc tính _id khỏi cá thể Mongoose của mình trước khi gửi phản hồi JSON cho khách hàng.Nhân bản vô tính của các đối tượng Mongoose và các thuộc tính xóa không hoạt động?

Ví dụ:

var ui = _.clone(userInvite); 
delete ui["_id"]; 
console.log(JSON.stringify(ui)); //still has "_id" property, why? 

Các trước đã không làm việc.

Tuy nhiên, nếu tôi làm:

var ui = JSON.parse(JSON.stringify(userInvite)); //poor man's clone 
delete ui["_id"]; 
console.log(JSON.stringify(ui)); //"_id" is gone! it works! 

Tôi không hiểu tại sao gọi delete trên một đối tượng nhân bản sử dụng gạch không làm việc, nhưng nếu tôi làm JSON.string hacky/JSON.parse, nó hoạt động.

Bất kỳ suy nghĩ nào về hành vi này?

+0

Có lẽ một loại chồn được trolling bạn và thực hiện '_id' như một getter/setter thay vì sau đó là một tài sản . Hãy thử 'Object.getOwnPropertyDescriptor (userInvite," _id "). Get' – Raynos

+0

Sửa đổi bất kỳ thuộc tính nào của đối tượng mong sao chép cũng không thể. – Hill

Trả lời

6

Tôi vừa gặp sự cố tương tự đang cố gắng thay thế _id bằng id. Việc làm này đã làm việc cho tôi:

Schema.methods.toJSON = function(options) { 
    var document = this.toObject(options); 
    document.id = document._id.toHexString(); 
    delete(document._id); 
    return document; 
}; 

Có lẽ nó sẽ bắt đầu làm việc nếu bạn thay thế delete ui["_id"] với delete ui._id hoặc sử dụng toObject thay vì _.clone.

+0

Tôi chỉ gặp phải điều này khi cố gắng xóa mật khẩu khỏi đối tượng người dùng của mình và bị bối rối trong một thời gian ngắn vì lý do 'xóa user.password' không hoạt động. Sử dụng toObject() trên nó dường như đã thực hiện các trick. Tôi đoán là mongoose không thực sự lưu trữ các thuộc tính như các thuộc tính trên đối tượng và xây dựng nó một cách linh động bằng cách sử dụng một phương thức toString hoặc một cái gì đó tương tự. – Fapiko

0

Chỉ cần thêm vào câu trả lời trước, có một cách khác để đạt được điều tương tự. chức năng 'toObject' áp dụng chuyển đổi các tài liệu được định nghĩa bởi hàm schema.options.toObject.transform, ví dụ:

schema.options.toObject.transform = function(doc, ret) { 
    ret.id = doc._id; 
    delete ret._id; 
}; 
Các vấn đề liên quan