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

Mongoose:CastError:Cast to ObjectId mislykkedes for værdien [object Object] ved sti _id

Kort svar:brug mongoose.Types.ObjectId .

Mongoose (men ikke mongo) kan acceptere objekt-id'er som strenge og "caste" dem korrekt for dig, så brug bare:

MyClass.findById(req.params.id)

Advarslen er dog, hvis req.params.id er ikke et gyldigt format for en mongo-id-streng, som vil give en undtagelse, som du skal fange.

Så den vigtigste forvirrende ting at forstå er, at mongoose.SchemaTypes har ting, du kun bruger, når du definerer mongoose-skemaer, og mongoose.Types har de ting, du bruger, når du opretter dataobjekter, du vil gemme i databasen eller forespørgselsobjekter. Så mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") fungerer, vil give dig et objekt, du kan gemme i databasen eller bruge i forespørgsler, og vil give en undtagelse, hvis du får en ugyldig ID-streng.

findOne tager et forespørgselsobjekt og sender en enkelt modelforekomst til tilbagekaldet. Og findById er bogstaveligt talt en indpakning af findOne({_id: id}) (se kildekoden her). Bare find tager et forespørgselsobjekt og sender en række matchende modelforekomster til tilbagekaldet.

Bare gå langsomt. Det er forvirrende, men jeg kan garantere dig, at du bliver forvirret og ikke rammer insekter i mongoose på dette tidspunkt. Det er et ret modent bibliotek, men det tager lidt tid at få styr på det.

Den anden mistænkelige ting, jeg ser i dit uddrag, er ikke at bruge new når du instansierer ChildClass . Udover det skal du sende din skemakode, for at vi kan hjælpe dig med at opspore eventuelle CastErrors, der er tilbage.



  1. rails + docker + sidekiq + Fejl ved forbindelse til Redis på 127.0.0.1:6379 (Errno::ECONNREFUSED)

  2. MongoDB $min

  3. Gem delmængde af MongoDB-samling til en anden samling

  4. Hvad kan gøres ved at bruge CKANs asynkrone baggrundsjob?