Mongoose 對象的特殊性


一、偶遇難題

在最近使用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 在輸出時刪掉里面的空字段,默認為true
  • transform 在轉換之前,可以利用這個方法做點想做的事情
  • 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);

果然,最終解決了這個問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM