Krótka odpowiedź:użyj mongoose.Types.ObjectId .
Mongoose (ale nie mongo) może akceptować identyfikatory obiektów jako ciągi i "rzucać" je poprawnie za Ciebie, więc po prostu użyj:
MyClass.findById(req.params.id)
Jednak zastrzeżeniem jest, jeśli req.params.id
nie jest poprawnym formatem dla łańcucha identyfikatora mongo, który zgłosi wyjątek, który musisz przechwycić.
Więc główną mylącą rzeczą do zrozumienia jest to, że mongoose.SchemaTypes
ma rzeczy, których używasz tylko podczas definiowania schematów mongoose, i mongoose.Types
ma to, czego używasz podczas tworzenia obiektów danych, które chcesz przechowywać w bazie danych lub obiektach zapytań. Więc mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
działa, da ci obiekt, który możesz przechowywać w bazie danych lub użyć w zapytaniach, i wyrzuci wyjątek, jeśli otrzyma nieprawidłowy ciąg ID.
findOne
pobiera obiekt zapytania i przekazuje pojedynczą instancję modelu do wywołania zwrotnego. I findById
jest dosłownie opakowaniem findOne({_id: id})
(patrz kod źródłowy tutaj). Po prostu find
pobiera obiekt zapytania i przekazuje tablicę pasujących instancji modelu do wywołania zwrotnego.
Po prostu idź powoli. To mylące, ale gwarantuję, że w tym momencie jesteś zdezorientowany i nie trafiasz na błędy w manguście. To dość dojrzała biblioteka, ale zrozumienie jej zajmuje trochę czasu.
Inną podejrzaną rzeczą, którą widzę w twoim fragmencie, jest nieużywanie new
podczas tworzenia instancji ChildClass
. Poza tym musisz opublikować swój kod schematu, abyśmy mogli pomóc Ci rozwiązać wszelkie pozostałe błędy CastErrors.