Respuesta corta:usa mongoose.Types.ObjectId .
Mongoose (pero no Mongo) puede aceptar Id. de objetos como cadenas y "transmitirlos" correctamente para usted, así que solo use:
MyClass.findById(req.params.id)
Sin embargo, la advertencia es si req.params.id
no es un formato válido para una cadena de ID de mongo, eso arrojará una excepción que debe capturar.
Entonces, lo más confuso que hay que entender es que mongoose.SchemaTypes
tiene cosas que solo usas cuando defines esquemas mongoose, y mongoose.Types
tiene las cosas que usa al crear objetos de datos que desea almacenar en la base de datos o consultar objetos. Entonces mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
funciona, le dará un objeto que puede almacenar en la base de datos o usar en consultas, y lanzará una excepción si se le da una cadena de identificación no válida.
findOne
toma un objeto de consulta y pasa una sola instancia de modelo a la devolución de llamada. Y findById
es literalmente un envoltorio de findOne({_id: id})
(ver código fuente aquí). Solo find
toma un objeto de consulta y pasa una matriz de instancias de modelos coincidentes a la devolución de llamada.
Ve despacio. Es confuso, pero puedo garantizarle que se está confundiendo y que no encuentra errores en la mangosta en este punto. Es una biblioteca bastante madura, pero se necesita algo de tiempo para dominarla.
La otra cosa sospechosa que veo en tu fragmento es no usar new
al instanciar ChildClass
. Más allá de eso, deberá publicar su código de esquema para que podamos ayudarlo a rastrear cualquier CastErrors que quede.