2012-02-23 10 views
8

मैं मोंगोस का उपयोग कर रहा हूं और मैं क्लाइंट को JSON प्रतिक्रिया भेजने से पहले अपने मोंगोस इंस्टेंस से _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 बुला, लेकिन अगर मैं hacky JSON.string/JSON.parse करते हैं, यह काम करता हैं।

इस व्यवहार पर कोई विचार?

+0

शायद नेवला आप trolling और 'एक संपत्ति के रूप में एक गेटर/सेटर के रूप में _id' को लागू करने के बजाय तो है करने के लिए लागू होता है परिवर्तन । 'ऑब्जेक्ट.getOwnPropertyDescriptor (userInvite, "_id") आज़माएं। – Raynos

+0

क्लोनिंग mongoose ऑब्जेक्ट के किसी भी गुण को संशोधित करना असंभव है। – Hill

उत्तर

6

मैं को 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

मैं बस अपने उपयोगकर्ता ऑब्जेक्ट से पासवर्ड हटाने की कोशिश कर रहा था और कुछ समय के लिए स्टंप किया गया था कि 'user.password' को क्यों हटाया जा रहा था। ऐसा लगता है कि ToObject() का उपयोग करना चाल चल रहा है। मेरा अनुमान है कि मोंगोज़ वास्तव में ऑब्जेक्ट्स पर गुणों के रूप में गुणों को संग्रहीत नहीं कर रहा है और इसे टॉस्ट्रिंग विधि या इसी तरह के कुछ का उपयोग करके गतिशील रूप से बनाता है। – Fapiko

0

बस पिछले उत्तर में जोड़ने के लिए, इसे प्राप्त करने का एक और तरीका है। 'ToObject' समारोह दस्तावेज है जो schema.options.toObject.transform समारोह द्वारा परिभाषित किया गया है, जैसे

schema.options.toObject.transform = function(doc, ret) { 
    ret.id = doc._id; 
    delete ret._id; 
}; 
संबंधित मुद्दे