Kort antwoord:gebruik mongoose.Types.ObjectId .
Mongoose (maar niet mongo) kan object-ID's als tekenreeksen accepteren en ze op de juiste manier voor u "casten", dus gebruik gewoon:
MyClass.findById(req.params.id)
Het voorbehoud is echter als req.params.id
is geen geldige indeling voor een mongo ID-tekenreeks, die een uitzondering genereert die u moet opvangen.
Dus het belangrijkste verwarrende om te begrijpen is dat mongoose.SchemaTypes
heeft dingen die je alleen gebruikt bij het definiëren van mangoestschema's, en mongoose.Types
heeft de dingen die u gebruikt bij het maken van gegevensobjecten die u in de database of query-objecten wilt opslaan. Dus mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
werkt, geeft u een object dat u in de database kunt opslaan of in query's kunt gebruiken, en zal een uitzondering genereren als een ongeldige ID-tekenreeks wordt gegeven.
findOne
neemt een query-object en geeft een enkele modelinstantie door aan de callback. En findById
is letterlijk een wrapper van findOne({_id: id})
(zie broncode hier). Gewoon find
neemt een query-object en geeft een reeks overeenkomende modelinstanties door aan de callback.
Ga gewoon langzaam. Het is verwarrend, maar ik kan je garanderen dat je op dit moment in de war raakt en geen bugs in mangoest raakt. Het is een behoorlijk volwassen bibliotheek, maar het kost wat tijd om het onder de knie te krijgen.
Het andere verdachte dat ik in je fragment zie, is het gebruik van new
bij het instantiëren van ChildClass
. Verder moet je je schemacode posten zodat we je kunnen helpen eventuele resterende CastErrors op te sporen.