Actualizar
Tal vez entendí mal su pregunta original, pero ahora parece que la naturaleza de su pregunta cambió, por lo que la siguiente información no es relevante, pero la dejo. :)
Probé tu código y me funciona bien. Mongoose no ejecuta ningún código especial cuando establece propiedades que no forman parte del esquema (o algunas otras propiedades especiales). Actualmente, JavaScript no admite código de llamada para propiedades que aún no existen (por lo que Mongoose no puede interferir con el conjunto de goo
propiedad por ejemplo).
Entonces, cuando establece la propiedad:
foo.goo = { c: 1 };
Mangosta no está involucrada. Si su console.log
era algo diferente al código que mostraste, pude ver que podría informar incorrectamente.
Además, cuando send
los resultados de vuelta como JSON, JSON.stringify
se está llamando, que llama a toString
en su modelo Mangosta. Cuando eso sucede, Mongoose solo usa las propiedades definidas en el esquema. Por lo tanto, no se devuelven propiedades adicionales de forma predeterminada. Has cambiado la naturaleza de los data
Sin embargo, la matriz apunta directamente a los datos de Mongoose, por lo que evita ese problema.
Detalles sobre el comportamiento normal
Cuando estableces la propiedad goo
usando Mongoose, suceden bastantes cosas. Mongoose crea captadores/establecedores de propiedades a través de Object.defineProperty
(algunos docs
). Entonces, cuando configuras el goo
propiedad, que ha definido como [String]
, suceden algunas cosas:
- El código Mongoose se llama antes de que el valor se establezca en la instancia del objeto (a diferencia de un objeto JavaScript simple)
- Mongoose crea una matriz (opcionalmente) para almacenar los datos (una
MongooseArray
) que contendrá los datos de la matriz. En el ejemplo que proporcionó, dado que no pasó una matriz, se creará. - Mongoose intentará convertir sus datos al tipo correcto
- Llamará a
toString
sobre los datos pasados como parte del elenco.
Entonces, los resultados son que el documento ahora contiene una matriz con un toString
versión del objeto que pasaste.
Si comprobaste el contenido del goo
propiedad, vería que ahora es una matriz con un solo elemento, que es una cadena que contiene [object Object]
. Si hubiera elegido un tipo más básico o si hubiera hecho coincidir el tipo de almacenamiento de la propiedad de destino, vería que una verificación de igualdad básica habría funcionado.