Aktualizacja
Może źle zrozumiałem Twoje pierwotne pytanie, ale teraz wygląda na to, że zmienił się charakter Twojego pytania, więc poniższe informacje są nieistotne, ale zostawiam je. :)
Przetestowałem twój kod i dla mnie działa dobrze. Mongoose nie wykonuje żadnego specjalnego kodu podczas ustawiania właściwości, które nie są częścią schematu (lub kilku innych właściwości specjalnych). JavaScript obecnie nie obsługuje wywoływania kodu dla właściwości, które jeszcze nie istnieją (więc Mongoose nie może stanąć na drodze zestawu goo
na przykład właściwość).
Tak więc po ustawieniu właściwości:
foo.goo = { c: 1 };
Mongoose nie jest w to zamieszana. Jeśli Twój console.log
było coś innego niż wyświetlony kod, widziałem, że może to zgłosić niepoprawnie.
Dodatkowo, gdy send
wyniki z powrotem w formacie JSON, JSON.stringify
jest wywoływany, co wywołuje toString
na twoim modelu Mongoose. W takim przypadku Mongoose używa tylko właściwości zdefiniowanych w schemacie. Tak więc domyślnie nie są odsyłane żadne dodatkowe właściwości. Zmieniłeś charakter data
jednak tablicę, aby bezpośrednio wskazywać dane Mongoose, aby uniknąć tego problemu.
Szczegóły dotyczące normalnego zachowania
Po ustawieniu właściwości goo
używając Mongoose, dzieje się sporo rzeczy. Mongoose tworzy pobierające/ustawiające właściwości za pomocą Object.defineProperty
(niektóre dokumenty
). Tak więc, gdy ustawisz goo
właściwość, którą zdefiniowałeś jako [String]
, dzieje się kilka rzeczy:
- Kod Mongoose jest wywoływany przed ustawieniem wartości na instancję obiektu (w przeciwieństwie do prostego obiektu JavaScript)
- Mongoose tworzy tablicę (opcjonalnie) do przechowywania danych (
MongooseArray
), który będzie zawierał dane tablicy. W podanym przykładzie, ponieważ nie przekazałeś tablicy, zostanie ona utworzona. - Mongoose spróbuje przesłać Twoje dane do właściwego typu
- Wywoła
toString
na danych przekazanych w ramach obsady.
Wyniki są więc takie, że dokument zawiera teraz tablicę z toString
wersja przekazanego obiektu.
Jeśli zaznaczyłeś zawartość goo
Zobaczysz, że jest to tablica z pojedynczym elementem, który jest ciągiem zawierającym [object Object]
. Jeśli wybierzesz bardziej podstawowy typ lub pasujesz do typu przechowywania właściwości docelowej, zobaczysz, że podstawowe sprawdzenie równości zadziałałoby.