Кратък отговор:използвайте 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.