Кратък отговор:използвайте mongoose.Types.ObjectId .
Mongoose (но не и mongo) може да приема идентификатори на обекти като низове и да ги „прехвърля“ правилно вместо вас, така че просто използвайте:
MyClass.findById(req.params.id)
Въпреки това, предупреждението е ако req.params.id не е валиден формат за mongo ID низ, който ще изведе изключение, което трябва да хванете.
Така че основното объркващо нещо, което трябва да разберете, е, че mongoose.SchemaTypes има неща, които използвате само при дефиниране на схеми на mongoose и mongoose.Types има нещата, които използвате, когато създавате обекти с данни, които искате да съхраните в базата данни или обекти за заявка. Така че mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") работи, ще ви даде обект, който можете да съхранявате в базата данни или да използвате в заявки, и ще изведе изключение, ако е даден невалиден низ за идентификатор.
findOne взема обект на заявка и предава един модел на екземпляра на обратното извикване. И findById е буквално обвивка на findOne({_id: id}) (вижте изходния код тук). Просто find приема обект на заявка и предава масив от съвпадащи екземпляри на модел към обратното извикване.
Просто върви бавно. Това е объркващо, но мога да ви гарантирам, че се обърквате и не удряте грешки в mongoose в този момент. Това е доста зряла библиотека, но отнема известно време, за да се овладеете.
Другото подозрително нещо, което виждам във вашия фрагмент, не е използването на new при инстанциране на ChildClass . Освен това ще трябва да публикувате кода на вашата схема, за да ви помогнем да отстраните всички останали CastErrors.