2012-02-23 3 views
8

저는 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! 

이해하지 않는 이유 밑줄이 작동하지 않습니다 사용하여 복제 된 개체에 대한 delete를 호출,하지만 난 해키 JSON.string/JSON.parse을 할 경우, 그것은 작동합니다.

이 동작에 대한 의견이 있으십니까?

+0

아마를 보내지와 속성으로보다는 게터/세터로'_id' 구현된다 몽구스에 변환을 적용 . 'Object.getOwnPropertyDescriptor (userInvite, "_id"). get'을 시도하십시오 – Raynos

+0

개체를 복제하는 모든 속성을 수정하는 것도 불가능합니다. – Hill

답변

6

_idid으로 바꾸려고 할 때 비슷한 문제가 발생했습니다. 이 나를 위해 일을 수행 :

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

것은 어쩌면 그것은 당신이 delete ui._iddelete ui["_id"]를 교체하거나 toObject 대신 _.clone를 사용하는 경우 작업을 시작합니다.

+0

난 그냥 내 사용자 개체에서 암호를 제거하려고 들어 와서 왜 'user.password 삭제'가 작동하지 않았는지에 관해서 꽤 당황했다. toObject()를 사용하면 트릭을 완료 한 것으로 보입니다. 내 생각 엔 몽구스는 실제로 속성을 객체의 속성으로 저장하지 않고 toString 메서드 또는 비슷한 것을 사용하여 동적으로 만듭니다. – Fapiko

0

이전 답변에 추가하기 만하면 동일한 결과를 얻을 수있는 또 다른 방법이 있습니다. 'toObject'함수는 schema.options.toObject.transform 함수에 의해 정의 된 문서, 예

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