sql >> Base de Datos >  >> NoSQL >> MongoDB

Mangosta:¿Qué pasa con _doc?

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:

  1. 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)
  2. 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á.
  3. Mongoose intentará convertir sus datos al tipo correcto
  4. 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.