sql >> Databáze >  >> NoSQL >> MongoDB

Mongoose:CastError:Odeslání do ObjectId selhalo pro hodnotu [object Object] na cestě _id

Krátká odpověď:použijte mongoose.Types.ObjectId .

Mongoose (ale ne mongo) může přijmout ID objektů jako řetězce a správně je „obsadit“, takže stačí použít:

MyClass.findById(req.params.id)

Upozornění je však v případě req.params.id není platný formát pro řetězec mongo ID, který vyvolá výjimku, kterou musíte zachytit.

Takže hlavní matoucí věc k pochopení je, že mongoose.SchemaTypes obsahuje věci, které používáte pouze při definování schémat mongoose, a mongoose.Types obsahuje věci, které používáte při vytváření datových objektů, které chcete uložit do databáze nebo objektů dotazu. Takže mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") funguje, poskytne vám objekt, který můžete uložit do databáze nebo použít v dotazech, a vyvolá výjimku, pokud zadáte neplatný řetězec ID.

findOne vezme objekt dotazu a předá jednu instanci modelu zpětnému volání. A findById je doslova obal findOne({_id: id}) (zdrojový kód viz zde). Stačí find vezme objekt dotazu a předá pole odpovídajících instancí modelu zpětnému volání.

Jen pomalu. Je to matoucí, ale mohu vám zaručit, že v tomto bodě začínáte být zmatení a nenarážíte na chyby v mangustách. Je to docela vyspělá knihovna, ale nějakou dobu trvá, než se v ní dostanete.

Další podezřelá věc, kterou vidím ve vašem úryvku, není použití new při vytváření instance ChildClass . Kromě toho budete muset odeslat svůj kód schématu, abychom vám mohli pomoci odhalit zbývající chyby CastErrors.



  1. Jak získat všechny výsledky, pokud pole unwind v mongodb neexistuje

  2. Jak v Mongoose seřadím podle data? (node.js)

  3. node.js ukládá objekty v redis

  4. Skupinové pole po uvolnění a zápase