MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose :CastError :Échec de la conversion en ObjectId pour la valeur [object Object] au chemin _id

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.