Bijwerken
Misschien heb ik uw oorspronkelijke vraag verkeerd begrepen, maar nu lijkt het erop dat de aard van uw vraag is gewijzigd, dus de onderstaande informatie is niet relevant, maar ik laat het hierbij. :)
Ik heb je code getest en bij mij werkt het prima. Mongoose voert geen speciale code uit wanneer u eigenschappen instelt die geen deel uitmaken van het schema (of een paar andere speciale eigenschappen). JavaScript ondersteunt momenteel geen aanroepcode voor eigenschappen die nog niet bestaan (dus Mongoose kan de set van de goo
niet in de weg staan onroerend goed bijvoorbeeld).
Dus, wanneer u de eigenschap instelt:
foo.goo = { c: 1 };
Mongoose is er niet bij betrokken. Als uw console.log
iets anders was dan de code die u weergaf, kon ik zien dat deze onjuist zou kunnen rapporteren.
Bovendien, wanneer u send
de resultaten terug als JSON, JSON.stringify
wordt aangeroepen, die toString
. aanroept op uw Mongoose-model. Wanneer dat gebeurt, gebruikt Mongoose alleen de eigenschappen die in het schema zijn gedefinieerd. Er worden dus standaard geen extra eigenschappen teruggestuurd. U heeft de aard van de data
gewijzigd array om rechtstreeks naar de Mongoose-gegevens te wijzen, dus het vermijdt dat probleem.
Details over normaal gedrag
Wanneer u de eigenschap goo
. instelt met Mongoose gebeuren er nogal wat dingen. Mongoose maakt eigenschap getters/setters via de Object.defineProperty
(sommige docs
). Dus, wanneer u de goo
eigenschap, die u heeft gedefinieerd als een [String]
, gebeuren er een paar dingen:
- Mongoose-code wordt aangeroepen voordat de waarde wordt ingesteld op de objectinstantie (in tegenstelling tot een eenvoudig JavaScript-object)
- Mongoose maakt een array (optioneel) om de gegevens op te slaan (een
MongooseArray
) die de arraygegevens zal bevatten. In het voorbeeld dat je hebt gegeven, wordt deze gemaakt, aangezien je geen array hebt doorgegeven. - Mongoose zal proberen je gegevens naar het juiste type te casten
- Het roept
toString
. aan op de gegevens die zijn doorgegeven als onderdeel van de cast.
De resultaten zijn dus dat het document nu een array bevat met een toString
versie van het object dat je hebt doorgegeven.
Als je de inhoud van de goo
. hebt gecontroleerd eigenschap, zou je zien dat het nu een array is met een enkel element, wat een string is die [object Object]
bevat . Als u een meer basistype had gekozen of overeenkwam met het opslagtype van de bestemmingseigenschap, zou u zien dat een basiscontrole op gelijkheid zou hebben gewerkt.