2017-01-25 30 views
0

我正在使用mongoose Schemas爲我的mongodb創建模型,並且我想知道是否使用默認值。我知道使用默認值對於createdAt和類似的值是有好處的,但在我的情況下,我的模式中有一堆屬性,這可能會導致客戶端中有很多空指針。我應該在我的貓鼬模式上使用默認值解決這個問題,還是應該在客戶端或者nodejs上處理這個問題?在mongodb(mongoose)中使用默認值來處理缺失的屬性

+0

這是缺少/ null時的問題嗎?如果是這樣,爲什麼? –

+0

好吧,如果沒有處理,訪問一個屬性例如obj ['someProperty']將會拋出一個錯誤。 – mrlarssen

+0

顯然。如果它真的困擾你在FE和BE書寫檢查,我會使用默認值... –

回答

1

我的答案只是爲了避免在模式字段未使用時使用默認值。在我的生產節點/蒙戈/貓鼬的應用程序,有一些點,有助於使這是一個很好的策略:

  • 貓鼬不保存未使用的字段,即那些不具有默認的模式,並在創建操作期間未設置。這節省了大量的Mongo磁盤空間,因爲每個Mongo文檔都將字段名稱和值存儲在JSON文檔中。使用短字段名稱和避免不必要的默認值,我已經看到磁盤空間增加了60%。
  • 當您在通過Mongoose查詢處理數據庫的NodeJS中編寫代碼時,即使未設置,您也會獲得可處理存在/不存在模式屬性的Mongoose裝飾對象。請注意,如果您執行model.find()操作,則這是默認行爲。就後端代碼而言,您不必擔心處理Javascript未定義的異常。 Mongoose將幫助設置架構中聲明的任何屬性,並且它也會反過來忽略(而不是序列化到數據庫)您添加的未聲明的任何屬性。
  • 請注意,上述功能是昂貴的查詢。 底線:如果您在NodeJS中編寫代碼以在執行創建或更新方法時獲取/設置道具,則使用Mongoose裝飾的對象將處理架構默認值等。如果您只是查詢將數據發送回前端,結束(因爲),你應該在你的Mongoose查詢中使用.lean()方法 - 它們明顯更快。
  • 在前端,不具有值,但需要缺省值可以與很容易地處理字段 - 屬性是1級深:該嵌套

    var someField = myMongoDoc.attrWithoutDefault || 'default value'; 
    
  • 屬性(例如myMongoDoc.attr1 .subAttr1)可以使用類似lodash的庫進行測試(請參閱https://lodash.com/docs#get

+0

完美!謝謝 – mrlarssen