MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongoose:CastError:Cast su ObjectId non riuscito per il valore [oggetto oggetto] nel percorso _id

Risposta breve:usa mongoose.Types.ObjectId .

Mongoose (ma non mongo) può accettare gli ID oggetto come stringhe e "trasmetterli" correttamente per te, quindi usa:

MyClass.findById(req.params.id)

Tuttavia, l'avvertenza è se req.params.id non è un formato valido per una stringa ID mongo, che genererà un'eccezione che devi catturare.

Quindi la cosa confusa principale da capire è che mongoose.SchemaTypes ha elementi che usi solo quando definisci schemi mongoose e mongoose.Types ha le cose che usi quando crei oggetti di dati che vuoi archiviare nel database o oggetti di query. Quindi mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") funziona, ti darà un oggetto che puoi archiviare nel database o utilizzare nelle query e genererà un'eccezione se viene fornita una stringa ID non valida.

findOne prende un oggetto query e passa una singola istanza del modello al callback. E findById è letteralmente un wrapper di findOne({_id: id}) (vedi codice sorgente qui). Basta find prende un oggetto query e passa un array di istanze del modello corrispondenti al callback.

Vai piano. È fonte di confusione, ma posso garantirti che ti stai confondendo e a questo punto non stai colpendo bug nella mangusta. È una libreria piuttosto matura, ma ci vuole del tempo per prenderci la mano.

L'altra cosa sospetta che vedo nel tuo snippet non è l'utilizzo di new quando si crea un'istanza di ChildClass . Oltre a ciò, dovrai pubblicare il codice dello schema per consentirci di aiutarti a eliminare eventuali CastError rimasti.