2011-09-21 28 views
139

Ho un documento da una ricerca di mangusta che voglio estendere prima della codifica JSON e l'invio come risposta. Se provo ad aggiungere proprietà al documento, viene ignorato. Le proprietà non compaiono in Object.getOwnPropertyNames(doc) rendendo impossibile un'estensione normale. La cosa strana è che JSON.parse(JSON.encode(doc)) funziona e restituisce un oggetto con tutte le proprietà corrette. C'è un modo migliore per farlo?Come si trasforma un documento Mongoose in un oggetto semplice?

risposta

156

Un altro modo per farlo è quello di dire a Mongoose che tutto ciò che serve è una pianura versione JavaScript del documento restituito da utilizzando lean() nella catena query. In questo modo Mongoose salta la fase di creazione dell'istanza modello completo e direttamente ottiene un doc è possibile modificare:

MyModel.findOne().lean().exec(function(err, doc) { 
    doc.addedProperty = 'foobar'; 
    res.json(doc); 
}); 
+10

toObject non funzionerebbe per me. lean() è perfetto – Deminetix

+0

Il nodo dice che il documento non ha il metodo toObject() ma .lean() funziona come per magia! – salihcenap

+1

Grande consiglio, grazie! –

21

il modo più veloce se la proprietà non è nel modello:

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

+4

sì ... e per quanto possa sembrare sorprendente, penso che questo possa essere utile. Ad esempio, tieni tutte le primitive del tuo oggetto. –

+0

Grazie per questa risposta, era quello che stavo cercando :) – datUser

0

un modo migliore per risolvere affrontare un problema come questo sta usando doc.toObject() come questo altri

doc.toObject({ getters: true }) 

opzioni includono:

  • getters: applicare tutte getter (percorso e getter virtuali)
  • virtuals: applicare getter virtuali (ignori opzione getter)
  • minimize: rimuovere oggetti vuoti (default true)
  • transform: una funzione di trasformazione per applicare il documento risultante prima di restituire
  • depopulate: spopolare qualsiasi percorso popolato, sostituendolo con i propri riferimenti originali (predefinito su falso)
  • versionKey: se includere la chiave di versione (di default a true)

così per esempio si può dire

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

e ora lavorerà

Problemi correlati