मुझे पता है कि यह उत्तर पहले से ही स्वीकार कर लिया गया है, लेकिन मैं यह इंगित करना चाहता था कि मोंगोज़ आपके लिए अधिकांश कास्टिंग का ख्याल रखता है ... ज्यादातर समय। हालांकि यह सुविधाजनक है कि मोंगोज यह करता है, यह मोन्गो के असली व्यवहार को दूर करता है। उदाहरण के लिए, नेवला आप कुछ इस तरह कर सकते हैं:
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
ऑपरेटर का उपयोग करने वाले कुछ प्रश्नों के लिए मैन्युअल रूप से मूल्य डालने की भी आवश्यकता है ... शायद इसकी आवश्यकता नहीं है। प्वाइंट है, अगर आपको अपने द्वारा अपेक्षित परिणामों को प्राप्त करने में परेशानी हो रही है, तो मूल्यों को स्वयं कास्टिंग करने का प्रयास करें।
_ "ध्यान दें कि पहला ऑब्जेक्ट अनुरोध से आता है, इसलिए यह पूरी तरह से स्ट्रिंग्स द्वारा बनाया गया है।" _ - आप उचित जगहों पर एक संख्या और बूलियन वापस करने के लिए क्यों नहीं बदलते? आपके द्वारा उद्धृत वाक्य में "इतना" का उपयोग केवल तात्पर्य है कि तारों की अनुमति है, लेकिन यह सत्य नहीं है यदि यह JSON है। (यानी, JSON स्वयं एक स्ट्रिंग-आधारित प्रारूप है, लेकिन यह _represent_ संख्याओं और बूलियन कर सकता है, और जब JSON को ऐसे गुणों का विश्लेषण किया जाता है तो संख्याएं और बूलियन बन जाते हैं ...) – nnnnnn
क्या आपकी स्कीमा में गुण ठीक हैं, या आपको आवश्यकता है उन्हें गतिशील? – Mahn
@nnnnnn, समस्या यह है कि एक्सप्रेस 'myObject [name]: name, myObject [someNumber]: 23' के रूप में जानकारी प्राप्त करता है, और एक्सप्रेस स्वयं प्रत्येक स्ट्रिंग को स्ट्रिंग पर डिफ़ॉल्ट रूप से myObject बनाता है! – renatoargh