2012-08-21 10 views
10

मैं एक्सप्रेस का उपयोग कर रहा हूँ और मैं एक सुविधाजनक तरीका वस्तु इस तरह की (जो अनुरोध req.body.myObject पर आता है) में परिवर्तित करने के लिए देख रहा हूँ:स्ट्रिंग आधारित जेएसओएन को मोंगोस स्कीमा ऑब्जेक्ट इंस्टेंस में कनवर्ट करने के लिए मूल विशेषता है?

var myObjectSchema = new Schema({ 
    name: String, 
    someNumber: Number, 
    someBoolean: Boolean 
}); 

: इस स्कीमा का एक उदाहरण में

{ 
    "name": "Foo", 
    "someNumber": "23", 
    "someBoolean": "on" 
} 

ध्यान दें कि पहला ऑब्जेक्ट अनुरोध से आता है, इसलिए यह स्ट्रिंग्स द्वारा पूरी तरह से बनाया गया है।

क्या यह हासिल करने का कोई अच्छा तरीका है? यदि नहीं, तो क्या आपको इस सुविधा को मिडलवेयर के रूप में कार्यान्वित करने के बारे में कोई सुझाव होगा ???

+1

_ "ध्यान दें कि पहला ऑब्जेक्ट अनुरोध से आता है, इसलिए यह पूरी तरह से स्ट्रिंग्स द्वारा बनाया गया है।" _ - आप उचित जगहों पर एक संख्या और बूलियन वापस करने के लिए क्यों नहीं बदलते? आपके द्वारा उद्धृत वाक्य में "इतना" का उपयोग केवल तात्पर्य है कि तारों की अनुमति है, लेकिन यह सत्य नहीं है यदि यह JSON है। (यानी, JSON स्वयं एक स्ट्रिंग-आधारित प्रारूप है, लेकिन यह _represent_ संख्याओं और बूलियन कर सकता है, और जब JSON को ऐसे गुणों का विश्लेषण किया जाता है तो संख्याएं और बूलियन बन जाते हैं ...) – nnnnnn

+0

क्या आपकी स्कीमा में गुण ठीक हैं, या आपको आवश्यकता है उन्हें गतिशील? – Mahn

+0

@nnnnnn, समस्या यह है कि एक्सप्रेस 'myObject [name]: name, myObject [someNumber]: 23' के रूप में जानकारी प्राप्त करता है, और एक्सप्रेस स्वयं प्रत्येक स्ट्रिंग को स्ट्रिंग पर डिफ़ॉल्ट रूप से myObject बनाता है! – renatoargh

उत्तर

10

इस धागे का संदर्भ देकर Mongoose : Inserting JS object directly into db मुझे पता चला कि हाँ, इसके लिए एक विशेष सुविधा है।

आप बस पैरामीटर के रूप में (फार्म से) एक नया मॉडल गुजर अनुरोध मूल्यों का निर्माण:

function add(req, res){ 
    new Contact(req.body.contact).save(function(err){ 
     console.log("Item added"); 
     res.send(); 
    }); 
}; 

यह स्वचालित रूप से आप के लिए सामान धर्मान्तरित!

+1

आपको संपर्क के सामने "नया" रखने की आवश्यकता नहीं है। यह नोड में महंगा है। फ़ंक्शन जोड़ें (req, res) { संपर्क (req.body.contact)। सेव (फ़ंक्शन (त्रुटि) { console.log ("आइटम जोड़ा गया"); res.send(); }); }; – fino

+0

हाय @ फिनो, आपकी सलाह के लिए धन्यवाद! क्या आप 'नया' नोड के लिए महंगा होने के बारे में कोई संसाधन प्रदान कर सकते हैं? एक शुरुआत के रूप में मैंने अभी तक इसके बारे में नहीं सुना है! धन्यवाद – renatoargh

+0

कई कारणों से यहां कुछ अच्छे लोग हैं http://ericleads.com/2012/09/stop-using-constructor-functions-in-javascript/। नोडजेस के लिए, नोडज मेमोरी प्रबंधन और ढेर आकार के लिए खोजें। – fino

0

परंतु स्कीमा स्थिर है, एक सैद्धांतिक रूप से आलसी, गैर परिष्कृत तरीका जा सकते हैं और सिर्फ मूल्यों के बजाय हार्डकोड वस्तु ही पास करने का: शायद जवाब नहीं आप देख रहे थे

var someObject = { 
    name: "Foo", 
    someNumber: "23", 
    someBoolean: "on" 
} 

var myObjectSchema = new Schema({ 
    name: someObject.name, 
    someNumber: parseInt(someObject.someNumber, 10), 
    someBoolean: (someObject.someBoolean == "on") 
}); 

, लेकिन कुछ भी बेहतर हो सकता है अगर कुछ भी बेहतर नहीं है।

+1

जैसा कि आप मानते थे, मैं इसे सामान्य रूप से करने का एक तरीका ढूंढ रहा हूं, हर बार जब मैं एक नई स्कीमा लिखता हूं उसे फिर से लिखने के बिना। – renatoargh

2

मुझे पता है कि यह उत्तर पहले से ही स्वीकार कर लिया गया है, लेकिन मैं यह इंगित करना चाहता था कि मोंगोज़ आपके लिए अधिकांश कास्टिंग का ख्याल रखता है ... ज्यादातर समय। हालांकि यह सुविधाजनक है कि मोंगोज यह करता है, यह मोन्गो के असली व्यवहार को दूर करता है। उदाहरण के लिए, नेवला आप कुछ इस तरह कर सकते हैं:

PersonModel.findById("4cdf00000000000000007822", ...); 

हालांकि, अगर आप डेटाबेस सीधे (नेवला के बिना) क्वेरी करने के लिए करने की कोशिश की, इस होगा नहीं काम:

PersonCollection.find({_id: "4cdf00000000000000007822"}, ...); 

इसका कारण यह है है ऑब्जेक्ट आईडी स्ट्रिंग नहीं हैं ... वे ऑब्जेक्ट्स हैं। आंतरिक रूप से, नेवला एक ObjectId है कि स्ट्रिंग धर्मान्तरित और फिर डेटाबेस के खिलाफ एक क्वेरी का निष्पादन ताकि अंतिम क्वेरी इस तरह थोड़े दिखता है:

PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...); 

इसके अलावा, एक स्कीमा में प्रत्येक पथ एक "ढलाईकार" विधि है। यह एक निजी विधि है, लेकिन जब आपको इसकी आवश्यकता होती है तो यह आसान है। कृपया ध्यान दें कि caster नीचे दिए गए तरीके से वितरित किए गए हैं और चेतावनी के बिना बदल सकते हैं। (चिल्ला के लिए खेद है) पर अपने स्वयं के जोखिम उपयोग:

// Use PersonModel.schema.paths() to get all paths and loop over them if you want 
var key = "name"; 
var pathObj = PersonModel.schema.path(key); 
if(!pathObj) pathObj = PersonModel.schema.virtualpath(key); 
if(!pathObj) { /* not found: return, continue, exit, whatever */ } 

// UNDOCUMENTED: USE AT YOUR OWN RISK 
var caster = pathObj.caster || pathObj; 
var castedValue = caster.cast(req.body.name); 

मैं यह जानता है क्यों? क्योंकि यदि आप एग्रीगेशन जैसे मोंगो की कुछ और अधिक उन्नत सुविधाओं का उपयोग करना चाहते हैं, तो आपको पाइपलाइन बनाने के दौरान अपने मूल्यों को डालना होगा। मुझे $in ऑपरेटर का उपयोग करने वाले कुछ प्रश्नों के लिए मैन्युअल रूप से मूल्य डालने की भी आवश्यकता है ... शायद इसकी आवश्यकता नहीं है। प्वाइंट है, अगर आपको अपने द्वारा अपेक्षित परिणामों को प्राप्त करने में परेशानी हो रही है, तो मूल्यों को स्वयं कास्टिंग करने का प्रयास करें।

+0

शोध के बाद उत्पादन में इसका उपयोग करने के लिए आप अपने दिमाग से बाहर होंगे। ओह! –

+1

इकाई परीक्षणों के साथ नहीं ... लोग अक्सर अनियंत्रित विशेषताओं का उपयोग करते हैं, और यदि आप अपने कोड का परीक्षण करते हैं, तो आप 100% सुरक्षित हैं। यदि विधि दूर हो जाती है, तो आपका परीक्षण उत्पादन में जाने से पहले इसे प्रकट करेगा और आप इसे ठीक करेंगे। मैं आपके जोखिम पर उपयोग करने के बारे में भी चेतावनी देता हूं। यदि आप परीक्षण नहीं लिखते हैं, तो यह आपकी समस्या है और यह आपके द्वारा उठाए जाने वाले जोखिम है;) –

संबंधित मुद्दे