J'ai un document provenant d'une mangouste que je souhaite étendre avant l'encodage JSON et son envoi en réponse. Si j'essaie d'ajouter des propriétés à la documentation, celle-ci est ignorée. Les propriétés n'apparaissent pas dans Object.getOwnPropertyNames(doc)
rendant une extension normale impossible. La chose étrange est que JSON.parse(JSON.encode(doc))
fonctionne et retourne un objet avec toutes les propriétés correctes. Y a-t-il une meilleure manière de faire cela?
Mongoose Model
s hérite de Document
s, qui possède une méthode toObject()
. Je crois que ce que vous recherchez devrait être le résultat de doc.toObject()
.
http://mongoosejs.com/docs/api.html#document_Document-toObject
Une autre façon de faire consiste à dire à Mongoose que tout ce dont vous avez besoin est une version JavaScript simple du document renvoyé en utilisant lean()
dans la chaîne de requête. De cette façon, Mongoose ignore l'étape de création de l'instance de modèle complète et vous obtenez directement un doc
que vous pouvez modifier:
MyModel.findOne().lean().exec(function(err, doc) {
doc.addedProperty = 'foobar';
res.json(doc);
});
le moyen rapide si la propriété n'est pas dans le modèle:
document.set( key,value, { strict: false });
Une meilleure façon de traiter un problème comme celui-ci consiste à utiliser doc.toObject()
comme ceci.
doc.toObject({ getters: true })
d'autres options incluent:
getters:
applique tous les getters (chemin et accesseurs virtuels)virtuals:
appliquer des getters virtuels (possibilité de remplacer l'option de getters)minimize:
supprime les objets vides (la valeur par défaut est true)transform:
une fonction de transformation à appliquer au document résultant avant de retournerdepopulate:
dépeupler tous les chemins remplis, en les remplaçant par leurs références d'origine (la valeur par défaut est false)versionKey:
s'il faut inclure la clé de version (la valeur par défaut est true)ainsi, par exemple, vous pouvez dire
Model.findOne().exec((err, doc) => {
if (!err) {
doc.toObject({ getters: true })
console.log('doc _id:', doc._id)
}
})
et maintenant ça va marcher.
Pour référence, voir: http://mongoosejs.com/docs/api.html#document_Document-toObject
Pour obtenir un objet brut dans le document Mongoose, j'ai utilisé la propriété _doc
comme suit
mongooseDoc._doc //returns plain json object
J'ai essayé avec toObject
mais cela m'a donné des fonctions, des arguments et tout ce dont je n'ai pas besoin.