आप एक मोंगोज़ दस्तावेज़ को एक सादे वस्तु में कैसे बदल सकते हैं?


200

मेरे पास एक दस्तावेज है जिसमें पाया गया है कि मैं JSON एन्कोडिंग से पहले विस्तार करना चाहता हूं और प्रतिक्रिया के रूप में भेज रहा हूं। अगर मैं डॉक्टर के गुणों को जोड़ने की कोशिश करता हूं तो इसे नजरअंदाज कर दिया जाता है। गुण Object.getOwnPropertyNames(doc)एक सामान्य विस्तार करने में संभव नहीं दिखाई देते हैं। अजीब बात यह है कि JSON.parse(JSON.encode(doc))सभी सही गुणों के साथ एक वस्तु काम करती है और वापस करती है। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

जवाबों:


292

Mongoose Models से विरासत में मिला है Document, जो एक toObject()विधि है। मेरा मानना ​​है कि आप जो खोज रहे हैं उसका परिणाम होना चाहिए doc.toObject()

http://mongoosejs.com/docs/api.html#document_Document-toObject


1
आखिरकार मिल गया। उन लोगों के लिए जिनके पास अपरिभाषित है, मॉडल के बजाय दस्तावेज़ पर कॉल करना सुनिश्चित करें। यानी मॉडलनाम ._doc.toObject ()
जॉन

1
यह ठीक है लेकिन दुबला () पसंद किया जाता है।
जेसन सेब्रिंग

यदि आप Model.find({})डॉक्स रिटर्न पर सरणी लौटाते हैं तो यह कार्य एक सरणी है। क्या आप docs.toObject कर सकते हैं?
जैक खाली

5
@jackblank अगर आपके पास मॉडल्स की एक सरणी है, तो आपको उनके ऊपर मैप करने में सक्षम होना चाहिए:var docArray = modelArray.map(function(model) { return model.toObject(); });
jmar777

@ jmar777 मुझे लगता है कि आपका सुझाव इस उत्तर पर एक संपादन के रूप में है।
r3wt

201

इसका दूसरा तरीका यह है कि मानगो को बताया जाए कि आपको जो कुछ चाहिए lean()वह क्वेरी श्रृंखला में उपयोग करके लौटाए गए डॉक्टर का एक सादा जावास्क्रिप्ट संस्करण है । इस तरह से Mongoose पूर्ण मॉडल उदाहरण बनाने के चरण को छोड़ देता है और आपको सीधे एक docसंशोधन मिल सकता है:

MyModel.findOne().lean().exec(function(err, doc) {
    doc.addedProperty = 'foobar';
    res.json(doc);
});

17
@Startec का उपयोग leanआम तौर पर अधिक प्रदर्शनकारी है क्योंकि आप पहले पूर्ण दस्तावेज़ बनाने के ओवरहेड को छोड़ देते हैं।
जॉनीएचके

3
यदि आप गलत हैं, तो आप एक चैंपियन हैं :) मुझे ठीक कर लें, लेकिन आपको हमेशा आपके द्वारा प्राप्त किए गए दस्तावेज़ को संशोधित करने और सहेजने का इरादा नहीं है, तो आपका पता () है, यदि आप इसे एक्सेस करने की कोशिश कर रहे हैं डॉक्टर और इसे अपने ग्राहक को वापस भेजें)
अमर्ष

1
@ अमर्ष हां, हालांकि यह भी मान लिया है कि आपको स्कीमा में परिभाषित किसी भी तरीके या वर्चुअल की आवश्यकता नहीं है।
जॉनीएचके

1
हालांकि बिज़ारे ... यह खोज () के साथ एक विकल्प हो सकता था ... अक्सर एक मोंगोडेब से एक दस्तावेज़ पढ़ने और इसे वेब ब्राउज़र पर वापस भेजने के लिए बहुत आम है। मुझे आश्चर्य है कि अगर पाया ()। दुबला () वास्तव में मिल का अर्थ है () पहले और फिर परिणाम में प्रत्येक तत्व के एक दुबला () लागू होते हैं, जिस स्थिति में, पाते हैं ()। दुबला () संयोजन वास्तव में खोजने की तुलना में धीमा होगा ()। अपने आप।
अमृत

4
@Amarsh नहीं, lean()क्वेरी का पीछा करते हुए क्वेरी को वास्तव में निष्पादित (द्वारा exec) करने से पहले विकल्प सेट करता है ताकि परिणाम सीधे उनके "दुबले" रूप में हों। कॉलिंग के सकारात्मक प्रदर्शन प्रभाव पक्ष के लिए यह प्रश्न देखें lean
जॉनीएचके

29

तेज़ तरीका अगर संपत्ति मॉडल में नहीं है:

document.set( key,value, { strict: false });


5
हाँ ... और जैसा कि यह देख सकता है, मैं अभी भी सोचता हूं कि यह उपयोगी हो सकता है। उदाहरण के लिए, आप अपने सभी ऑब्जेक्ट्स की प्रधानता को बनाए रखते हैं।
अल्बान मैलेरे

इस उत्तर के लिए धन्यवाद, यह वही था जिसकी मुझे तलाश थी :)
datUser 19

6

इस तरह एक मुद्दे से निपटने का एक बेहतर तरीका इस तरह का उपयोग कर रहा doc.toObject()है

doc.toObject({ getters: true })

अन्य विकल्पों में शामिल हैं:

  • getters: सभी गेटर्स लागू करें (पथ और वर्चुअल गेटर्स)
  • virtuals: वर्चुअल गेटर्स लागू करें (गेटर्स विकल्प को ओवरराइड कर सकते हैं)
  • minimize: खाली वस्तुओं को हटा दें (सत्य के लिए चूक)
  • transform: लौटने से पहले परिणामी दस्तावेज़ पर लागू करने के लिए एक परिवर्तन समारोह
  • depopulate: किसी भी आबादी वाले रास्तों को फिर से खोलना, उन्हें अपने मूल रेफ्स के साथ बदलना (झूठा करने के लिए चूक)
  • versionKey: संस्करण कुंजी को शामिल करना है या नहीं (सत्य की चूक)

इसलिए उदाहरण के लिए आप कह सकते हैं

Model.findOne().exec((err, doc) => {
   if (!err) {
      doc.toObject({ getters: true })
      console.log('doc _id:', doc._id)
   }
})

और अब यह काम करेगा।

संदर्भ के लिए, देखें: http://mongoosejs.com/docs/api.html#document_Document-toObject


3

Mongoose दस्तावेज़ से सादे वस्तु प्राप्त करने के लिए, मैंने _docनिम्नानुसार संपत्ति का उपयोग किया

mongooseDoc._doc  //returns plain json object

मैंने कोशिश की, toObjectलेकिन इसने मुझे कार्य, तर्क और अन्य सभी चीजें दीं जिनकी मुझे आवश्यकता नहीं है।


3
साथ गुण या तरीकों को एक्सेस करना _शुरुआत में यह आदर्श समाधान नहीं है। दुबले का प्रयोग आपके मामले को हल कर सकता है।
आर्थर कोस्टा

@ आर्थरब्रिटो हाँ। यह एक आदर्श समाधान नहीं है, लेकिन यह अभी भी एक समाधान है! । जवाब को नीचा दिखाने की जरूरत नहीं। मैंने _docकिसी भी मुद्दे का सामना किए बिना कई बार संपत्ति का उपयोग किया है। और leanविधि का उपयोग करने से आपको सादे वस्तु मिलती है जिस पर आप मॉडल संचालन नहीं कर सकते।
dd619

आप सही हे। बस अपने उत्तर में जोड़ें कि आदर्श समाधान नहीं है तो मैं नीचे को हटा दूंगा (मैं तब तक नहीं हटा सकता जब तक आप संपादित नहीं करते)
आर्थर कोस्टा

2

आप ऑब्जेक्ट को स्ट्रिंग भी कर सकते हैं और फिर सामान्य ऑब्जेक्ट बनाने के लिए पार्स कर सकते हैं। उदाहरण के लिए: -

const obj = JSON.parse(JSON.stringify(mongoObj))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.