¿Cómo se convierte un documento de Mangosta en un objeto sencillo?


Tengo un documento de mongoose find que quiero extender antes de codificar JSON y enviarlo como respuesta. Si intento agregar propiedades al documento, se ignora. Las propiedades no aparecen en Object.getOwnPropertyNames(doc) haciendo que una extensión normal no sea posible. Lo extraño es que JSON.parse(JSON.encode(doc)) funciona y devuelve un objeto con todas las propiedades correctas. ¿Hay una mejor manera de hacer esto?

Author: Lior Cohen, 2011-09-21

4 answers

Mangosta Model s heredan de Document s, que tienen un método toObject(). Creo que lo que estás buscando debe ser el resultado de doc.toObject().

Http://mongoosejs.com/docs/api.html#document_Document-toObject

 224
Author: jmar777,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-24 15:13:02

Otra forma de hacer esto es decirle a Mongoose que todo lo que necesita es una versión JavaScript simple del documento devuelto mediante el uso de lean() en la cadena de consultas. De esta manera Mangoose se salta el paso de crear la instancia completa del modelo y obtiene directamente un doc que puede modificar:

MyModel.findOne().lean().exec(function(err, doc) {
    doc.addedProperty = 'foobar';
    res.json(doc);
});
 166
Author: JohnnyHK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-22 13:47:58

La forma rápida si la propiedad no está en el modelo:

document.set( key,value, { strict: false });

 24
Author: alban maillere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-25 14:41:03

Una mejor manera de resolver un problema como este es usar doc.toObject() así

doc.toObject({ getters: true })

Otras opciones incluyen:

  • getters: aplicar todos los getters (ruta y getters virtuales)
  • virtuals: aplicar getters virtuales (puede anular la opción getters)
  • minimize: remove empty objects (defaults to true)
  • transform: una función de transformación para aplicar al documento resultante antes de devolver
  • depopulate: despoblar cualquier camino poblado, reemplazándolos con su refs original (por defecto es false)
  • versionKey: si se debe incluir la clave de versión (por defecto es true)

Así que por ejemplo puedes decir

Model.findOne().exec((err, doc) => {
   if (!err) {
      doc.toObject({ getters: true })
      console.log('doc _id:', doc._id)
   }
})

Y ahora funcionará.

Para referencia, ver: http://mongoosejs.com/docs/api.html#document_Document-toObject

 1
Author: Jalasem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-19 19:34:32