Réponse courte :utilisez mongoose.Types.ObjectId .
Mongoose (mais pas mongo) peut accepter les identifiants d'objets sous forme de chaînes et les "caster" correctement pour vous, alors utilisez simplement :
MyClass.findById(req.params.id)
Cependant, la mise en garde est si req.params.id
n'est pas un format valide pour une chaîne d'ID mongo, cela lèvera une exception que vous devez intercepter.
Donc, la principale chose déroutante à comprendre est que mongoose.SchemaTypes
contient des éléments que vous n'utilisez que lors de la définition de schémas de mangouste, et mongoose.Types
contient les éléments que vous utilisez lors de la création d'objets de données que vous souhaitez stocker dans la base de données ou des objets de requête. Donc mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
fonctionne, vous donnera un objet que vous pouvez stocker dans la base de données ou utiliser dans des requêtes, et lèvera une exception si une chaîne d'ID invalide est donnée.
findOne
prend un objet de requête et transmet une seule instance de modèle au rappel. Et findById
est littéralement un wrapper de findOne({_id: id})
(voir le code source ici). Il suffit de find
prend un objet de requête et transmet un tableau d'instances de modèle correspondantes au rappel.
Allez-y doucement. C'est déroutant, mais je peux vous garantir que vous êtes confus et que vous ne rencontrez pas de bugs dans la mangouste à ce stade. C'est une bibliothèque assez mature, mais il faut un certain temps pour s'y habituer.
L'autre chose suspecte que je vois dans votre extrait n'utilise pas new
lors de l'instanciation de ChildClass
. Au-delà de cela, vous devrez publier votre code de schéma afin que nous puissions vous aider à résoudre les erreurs CastErrors restantes.