2011-09-21 469 views
139

我有一個來自貓鼬的文檔,發現我想在JSON編碼之前擴展並作爲響應發送出去。如果我嘗試向文檔添加屬性,它將被忽略。這些屬性不會出現在Object.getOwnPropertyNames(doc)中,因此無法進行正常的擴展。奇怪的是,JSON.parse(JSON.encode(doc))工作並返回一個對象與所有正確的屬性。有一個更好的方法嗎?如何將Mongoose文檔轉換爲普通對象?

回答

156

另一種方式來做到這一點是告訴貓鼬,所有你需要的是一個普通的JavaScript通過在查詢鏈使用lean()版本返回的文檔中。這樣,貓鼬跳過創建完整的模型實例的步驟,你直接得到doc可以修改:

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

toObject不適合我。精益()是完美的 – Deminetix

+0

節點說doc沒有toObject()方法,但.lean()的作品就像魔術一樣! – salihcenap

+1

偉大的提示,謝謝! –

21

快速的方式,如果該物業的模式是不是:

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

+4

是的......並且儘可能讓人驚訝,但我仍然認爲這可能是有用的。例如,你保留所有對象的基元。 –

+0

感謝這個答案,這是我一直在尋找:) – datUser

0

解決像這樣的問題的更好方法是使用doc.toObject()這樣使用

doc.toObject({ getters: true }) 

其他選項包括:

  • getters:應用所有的吸氣劑(路徑和虛擬的getter)
  • virtuals:應用虛擬吸氣劑(可以覆蓋吸氣劑選項)
  • minimize:刪除空物體(默認爲true)
  • transform:變換函數在返回之前應用於生成的文檔
  • depopulate:將所有填充的路徑填充爲全部填充路徑,將其替換爲其原始參考(默認設置爲false)
  • versionKey:是否包括版本鍵(默認爲true)

因此,例如,你可以說

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

,現在它會工作