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

Mongoose:co je s _doc?

Aktualizovat

Možná jsem špatně pochopil vaši původní otázku, ale nyní to vypadá, že se povaha vaší otázky změnila, takže níže uvedené informace nejsou relevantní, ale nechávám je. :)

Testoval jsem váš kód a funguje mi dobře. Mongoose nespustí žádný speciální kód, když nastavíte vlastnosti, které nejsou součástí schématu (nebo několik dalších speciálních vlastností). JavaScript v současné době nepodporuje volající kód pro vlastnosti, které ještě neexistují (takže Mongoose nemůže překážet množině goo například majetek).

Takže, když nastavíte vlastnost:

foo.goo = { c: 1 };

Mongoose se neúčastní. Pokud váš console.log bylo něco jiného než kód, který jste zobrazili, viděl jsem, že se může hlásit nesprávně.

Navíc, když send výsledky zpět jako JSON, JSON.stringify je voláno, což volá toString na vašem modelu Mongoose. Když k tomu dojde, Mongoose použije pouze vlastnosti definované ve schématu. Ve výchozím nastavení se tedy žádné další vlastnosti neposílají zpět. Změnili jste povahu data pole přímo ukazovat na data Mongoose, takže se tomuto problému vyhne.

Podrobnosti o normálním chování

Když nastavíte vlastnost goo při použití Mongoose se stane docela dost věcí. Mongoose vytváří gettry/setters vlastností prostřednictvím Object.defineProperty (některé dokumenty ). Když tedy nastavíte goo vlastnost, kterou jste definovali jako [String] , stane se několik věcí:

  1. Kód Mongoose je volán před nastavením hodnoty na instanci objektu (na rozdíl od jednoduchého objektu JavaScript)
  2. Mongoose vytvoří pole (volitelně) pro uložení dat (MongooseArray ), který bude obsahovat data pole. V příkladu, který jste uvedli, bude pole vytvořeno, protože jste nepředali pole.
  3. Mongoose se pokusí přenést vaše data na správný typ
  4. Zavolá toString na datech předávaných jako součást obsazení.

Výsledkem je, že dokument nyní obsahuje pole s toString verze objektu, který jste předali.

Pokud jste zkontrolovali obsah goo vlastnost, viděli byste, že je to nyní pole s jedním prvkem, což je řetězec obsahující [object Object] . Pokud byste vybrali základnější typ nebo odpovídali typu úložiště cílové vlastnosti, viděli byste, že by fungovala základní kontrola rovnosti.



  1. insertMany Handle Duplicate Errors

  2. MongoDB:výjimka v initAndListen:20 Pokus o vytvoření souboru zámku v adresáři pouze pro čtení:/data/db, ukončení

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

  4. Mongodb vrátit starou sbírku