Resposta curta:use mongoose.Types.ObjectId .
O Mongoose (mas não o mongo) pode aceitar Ids de objetos como strings e "lançá-los" corretamente para você, então use:
MyClass.findById(req.params.id)
No entanto, a ressalva é se
req.params.id
não é um formato válido para uma string de ID do mongo, que lançará uma exceção que você deve capturar. Portanto, a principal coisa confusa a entender é que
mongoose.SchemaTypes
tem coisas que você só usa ao definir esquemas de mangusto e mongoose.Types
tem o material que você usa ao criar objetos de dados que deseja armazenar no banco de dados ou objetos de consulta. Então mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
funciona, fornecerá um objeto que você pode armazenar no banco de dados ou usar em consultas e lançará uma exceção se receber uma string de ID inválida. findOne
pega um objeto de consulta e passa uma única instância de modelo para o retorno de chamada. E findById
é literalmente um wrapper de findOne({_id: id})
(veja o código fonte aqui). Basta find
pega um objeto de consulta e passa uma matriz de instâncias de modelo correspondentes para o retorno de chamada. Apenas vá devagar. É confuso, mas posso garantir que você está ficando confuso e não encontrando bugs no mangusto neste momento. É uma biblioteca bastante madura, mas leva algum tempo para pegar o jeito.
A outra coisa suspeita que vejo no seu snippet não está usando
new
ao instanciar ChildClass
. Além disso, você precisará postar seu código de esquema para que possamos ajudá-lo a eliminar quaisquer CastErrors que permanecerem.