Актуализация
Може би съм разбрал погрешно първоначалния ви въпрос, но сега изглежда, че естеството на въпроса ви се е променило, така че информацията по-долу не е подходяща, но я оставям. :)
Тествах вашия код и работи добре за мен. Mongoose не изпълнява никакъв специален код, когато зададете свойства, които не са част от схемата (или няколко други специални свойства). Понастоящем JavaScript не поддържа извикващ код за свойства, които все още не съществуват (така че Mongoose не може да пречи на набора от goo
собственост например).
И така, когато зададете свойството:
foo.goo = { c: 1 };
Mongoose не е замесен. Ако вашият console.log
беше нещо различно от кода, който показахте, видях, че може да докладва неправилно.
Освен това, когато send
резултатите обратно като JSON, JSON.stringify
се извиква, което извиква toString
на вашия модел Mongoose. Когато това се случи, Mongoose използва само свойствата, дефинирани в схемата. Така че по подразбиране не се връщат допълнителни свойства. Вие променихте характера на data
масив, но да сочи директно към данните на Mongoose, така че избягва този проблем.
Подробности за нормалното поведение
Когато зададете свойството goo
с помощта на Mongoose се случват доста неща. Mongoose създава инструменти за получаване/задаване на свойства чрез Object.defineProperty
(някои документи
). Така че, когато зададете goo
свойство, което сте дефинирали като [String]
, се случват няколко неща:
- Кодът на Mongoose се извиква преди стойността да бъде зададена в екземпляра на обекта (за разлика от обикновен JavaScript обект)
- Mongoose създава масив (по избор) за съхраняване на данните (
MongooseArray
), който ще съдържа данните от масива. В дадения от вас пример, тъй като не сте предали масив, той ще бъде създаден. - Mongoose ще се опита да прехвърли вашите данни към правилния тип
- Ще извика
toString
върху данните, предадени като част от предаването.
И така, резултатите са, че документът вече съдържа масив с toString
версия на обекта, който сте предали.
Ако сте проверили съдържанието на goo
свойство, ще видите, че сега е масив с един елемент, който е низ, който съдържа [object Object]
. Ако сте избрали по-основен тип или сте съпоставили типа на съхранение на целевото свойство, ще видите, че основната проверка за равенство щеше да работи.