Opdater
Måske har jeg misforstået dit oprindelige spørgsmål, men nu ser det ud til, at karakteren af dit spørgsmål har ændret sig, så nedenstående oplysninger er ikke relevante, men jeg lader være. :)
Jeg testede din kode, og den fungerer fint for mig. Mongoose udfører ikke nogen speciel kode, når du angiver egenskaber, der ikke er en del af skemaet (eller et par andre specielle egenskaber). JavaScript understøtter i øjeblikket ikke kaldekode for egenskaber, der endnu ikke eksisterer (så Mongoose kan ikke komme i vejen for sættet af goo
ejendom for eksempel).
Så når du indstiller egenskaben:
foo.goo = { c: 1 };
Mongoose er ikke involveret. Hvis din console.log
var noget andet end den kode du viste, kunne jeg se, at den muligvis rapporterede forkert.
Derudover, når du send
resultaterne tilbage som JSON, JSON.stringify
bliver kaldt, hvilket kalder toString
på din Mongoose Model. Når det sker, bruger Mongoose kun de egenskaber, der er defineret på skemaet. Så ingen yderligere egenskaber sendes tilbage som standard. Du har ændret arten af data
array dog for direkte at pege på Mongoose-dataene, så det undgår det problem.
Detaljer om normal adfærd
Når du indstiller egenskaben goo
ved at bruge Mongoose sker der en del ting. Mongoose opretter egenskaber/sættere via Object.defineProperty
(nogle dokumenter
). Så når du indstiller goo
egenskab, som du har defineret som en [String]
, der sker et par ting:
- Mongoose-kode kaldes før værdien indstilles på objektforekomsten (i modsætning til et simpelt JavaScript-objekt)
- Mongoose opretter en matrix (valgfrit) til at gemme dataene (en
MongooseArray
), som vil indeholde array-dataene. I det eksempel, du angav, vil det blive oprettet, da du ikke bestod et array. - Mongoose vil forsøge at caste dine data til den rigtige type
- Den kalder
toString
på de data, der sendes som en del af castet.
Så resultaterne er, at dokumentet nu indeholder en matrix med en toString
version af det objekt, du har passeret.
Hvis du har tjekket indholdet af goo
egenskab, vil du se, at det nu er et array med et enkelt element, som er en streng, der indeholder [object Object]
. Hvis du havde valgt en mere grundlæggende type eller matchet destinationsejendommens lagertype, ville du se, at en grundlæggende lighedskontrol ville have fungeret.