web-dev-qa-db-fra.com

Comment transformer un document Mongoose en objet simple?

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?

184
respectTheCode

Mongoose Models hérite de Documents, 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

256
jmar777

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);
});
185
JohnnyHK

le moyen rapide si la propriété n'est pas dans le modèle:

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

25
alban maillere

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 retourner
  • depopulate: 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

3
Jalasem

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.

0
dd619