一、偶遇難題
在最近使用Mongoose的時候,遇到這樣一個問題:
我從DB中查詢出來一個對象,比如是Book,這個對象我想在返回時,給他附加一個字段,比如是字段A,正常來說,JS你只需要Book.A=Value,然后直接返回就是了,但是我在使用Mongoose的時候,無論如何,這個字段都不會被返回,但他也沒有報錯,搞得我都有點懷疑人生了。
二、萬能的同事
幾經周折,同事告知可能與Mongoose有關,他在Model中可以配置一些東西,比如:
{ strict: true, toObject: { virtuals: true }, toJSON: { virtuals: true } }
解釋一下這里面的幾行代碼,
第一句:strict,嚴格模式,用來配置在存入數據庫時,是否嚴格按照模型所約定的字段來,如果設置為false,則模型定義之外的字段也可以被存儲。
第二句:toObject,在toObject時的一些配置,比如virtuals:true就表示virtulas字段也可以被轉換到新的對象中
第三句與第二句差不多,是配置在轉換成為json時候的一些配置。
這里如果你想研究toObject和toJson時的更多配置,可以查看官方文檔:http://mongoosejs.com/docs/api.html#document_Document-toObject
這里的可配置項還有:
getters
輸出所有字段和virtual字段virtuals
設置virtual的輸出,可以覆蓋掉getters的配置minimize
在輸出時刪掉里面的空字段,默認為truetransform
在轉換之前,可以利用這個方法做點想做的事情depopulate 這個貌似是如果有外鍵關聯過的,把關聯的對象只保留一個id,默認為false
versionKey
版本號,這個應該是並發控制里面用的,沒有實際測試retainKeyOrder
輸出的順序是否按所配置的key來,如果你對順序有要求,那可以事先配置一下key,配置方法:Object.keys(new Doc({ a: 1, b: 2}).toObject())
三、解決問題
不過這個配置並不能解決我們的問題,但是回頭想想,他既然提供一個toObject方法,那就說明他這個對象不是一個標准的javascript對象,那我們把他toObject之后,然后再去加一些自己想要的屬性上去,最終序列化出去,不就完事兒了嗎?
最終的代碼類似於:
var model = obj.toObject(); model.isBorrow = false; cb(null, model);
果然,最終解決了這個問題。