¿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?
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
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);
});
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 });
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
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