2012-02-23 14 views
8

Mongoose kullanıyorum ve istemciye JSON yanıtını göndermeden önce Mongoose örneğimden _id özelliğini kaldırmak istiyorum.Underscore'un Mongoose Nesnelerini Klonlaması ve Özellikleri Silme Çalışmıyor mu?

Örnek:

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

önceki çalışmadı.

Ancak, ben yaparsam:

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

anlamıyorum neden Underscore çalışmıyor kullanarak klonlanmış nesne üzerinde delete arayarak, ama hacky JSON.string/JSON.parse yaparsanız, işe yarıyor.

Bu davranış hakkında herhangi bir düşünce var mı?

+0

Muhtemelen sizi trolling ve özellik olarak ziyade, bir alıcı/setter olarak '_id' uyguluyor firavun faresi için dönüşümü uygular . 'Object.getOwnPropertyDescriptor' (userInvite, "_id") 'ı deneyin. '' – Raynos

+0

Klonlama mongoose nesnesinin özelliklerini değiştirmek de imkansızdır. – Hill

cevap

6

_id'u id ile değiştirmeye çalışırken benzer bir sorunla karşılaştım. Bu benim için çalıştı yapmak:

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

Belki de delete ui._id ile delete ui["_id"] değiştirmek veya toObject yerine _.clone kullanırsanız çalışmaya başlayacaktır.

+0

Sadece kullanıcı nesnesinden şifreyi kaldırmaya çalışırken bunu araştırdım ve 'user.password'ı sil' neden çalışmıyordu. Üzerinde toObject() kullanarak hile yapmış gibi görünüyor. Benim tahminim, mongoose'un özniteliklerin özniteliklerini nesne üzerinde saklamaması ve bir toString yöntemini veya benzer bir şeyi kullanarak dinamik olarak oluşturmasıdır. – Fapiko

0

Sadece önceki cevaba eklemek için, aynı şeyi elde etmenin bir yolu daha var. 'ToObject' işlevi schema.options.toObject.transform fonksiyonu ile tanımlanır belgede, örneğin

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