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í:
- Kód Mongoose je volán před nastavením hodnoty na instanci objektu (na rozdíl od jednoduchého objektu JavaScript)
- 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. - Mongoose se pokusí přenést vaše data na správný typ
- 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.