संक्षिप्त उत्तर:mongoose.Types.ObjectId . का उपयोग करें ।
नेवला (लेकिन मोंगो नहीं) ऑब्जेक्ट आईडी को स्ट्रिंग्स के रूप में स्वीकार कर सकता है और उन्हें आपके लिए ठीक से "कास्ट" कर सकता है, इसलिए बस इसका उपयोग करें:
MyClass.findById(req.params.id)
हालांकि, चेतावनी यह है कि यदि req.params.id
मोंगो आईडी स्ट्रिंग के लिए मान्य प्रारूप नहीं है, जो एक अपवाद को फेंक देगा जिसे आपको अवश्य पकड़ना चाहिए।
तो समझने वाली मुख्य भ्रमित करने वाली बात यह है कि mongoose.SchemaTypes
आपके पास केवल नेवला स्कीमा और mongoose.Types
. को परिभाषित करते समय उपयोग की जाने वाली सामग्री है डेटा ऑब्जेक्ट बनाते समय आपके द्वारा उपयोग की जाने वाली सामग्री है जिसे आप डेटाबेस या क्वेरी ऑब्जेक्ट्स में संग्रहीत करना चाहते हैं। तो mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
काम करता है, आपको एक ऑब्जेक्ट देगा जिसे आप डेटाबेस में स्टोर कर सकते हैं या प्रश्नों में उपयोग कर सकते हैं, और एक अमान्य आईडी स्ट्रिंग दिए जाने पर एक अपवाद फेंक देगा।
findOne
एक क्वेरी ऑब्जेक्ट लेता है और कॉलबैक में एकल मॉडल इंस्टेंस पास करता है। और findById
वस्तुतः findOne({_id: id})
. का एक आवरण है (यहां स्रोत कोड देखें)। बस findOne
एक क्वेरी ऑब्जेक्ट लेता है और मेल खाने वाले मॉडल इंस्टेंस की एक सरणी को कॉलबैक में पास करता है।
बस धीमे चलें। यह भ्रमित करने वाला है लेकिन मैं आपको गारंटी दे सकता हूं कि आप भ्रमित हो रहे हैं और इस बिंदु पर नेवले में कीड़े नहीं मार रहे हैं। यह काफी परिपक्व पुस्तकालय है, लेकिन इसे समझने में कुछ समय लगता है।
दूसरी संदिग्ध चीज़ जो मुझे आपके स्निपेट में दिखाई दे रही है, वह new
का उपयोग नहीं कर रही है ChildClass
. को इंस्टेंट करते समय . इसके अलावा, आपको अपना स्कीमा कोड पोस्ट करना होगा ताकि हम बची हुई किसी भी CastErrors को ट्रैक करने में आपकी सहायता कर सकें।