2017-07-29 202 views
0

我已經創建了一個應該保存來自第三方API的數據的架構。不幸的是,這個API的名字有點窮,我想爲我的模式/數據庫使用正確的名字。將JSON對象映射到不同的架構字段名稱

API響應示例: 我縮短了很多響應。它有大約20個領域。

let apiResponse = { 
    id: {high:1, low:388}, 
    username:"xyz", 
    addr: [{ 
     fdn: "Street 123", 
     dq: "5534" 
    },{ 
     fdn: "Street 456", 
     dq: "1102" 
    }] 
} 

我的模式是這樣的:

let userSchema = mongoose.Schema({ 
    account_id: { 
     high: { 
      type: Number, 
      required: true 
     }, 
     low: { 
      type: Number, 
      required: true 
     } 
    }, 
    username: { 
     type: String, 
     required: true, 
     index: true 
    }, 
    addresses: [{ 
     street: { 
      type: String, 
      required: true 
     }, 
     zip: { 
      type: Number, 
      required: true 
     } 
    }], 
}) 

我的問題:

  1. 什麼將這些愚蠢的原始名稱到我的模式字段名稱映射的最佳方法?
  2. 我應該簡單地創建一個輔助函數還是有一個我可以用於這個「映射過程」的貓鼬特徵?
  3. 我經常看到使用camelCase命名字段的API,但mongodb更喜歡snake_case。我應該忽略mongodb命名約定,以便我不需要這樣的「映射」?
+1

聽起來像你將不得不以任何方式創建一個地圖。現在要做到這一點很重要。 1&2,你可以通過鉤入userSchema.pre('validate',function(){})在貓鼬中間件級別執行它。在它上行到保存之前,映射到正確的字段。確保刪除你不想在你的數據庫中顯示的字段。 3,是一個偏好問題。如果這是你的代碼,你的構建,我不明白你爲什麼不能使用首選的命名方案。 – Nuspeed1

+1

您可以嘗試的另一種方法是在架構的靜態函數中實現映射器。通過此功能運行每個新字段並返回正確的文檔。 userSchema.statics.map = function(apiObject){//映射東西,返回映射對象}。這樣,傳入的apiResponse數據和映射功能就保留在userSchema的範圍內。 – Nuspeed1

+0

@ Nuspeed1我假設我想使用pre('validate'),這樣我的驗證器(如required)會檢查。如果你可以給出一個快速的代碼示例,你可以把它作爲答案來包裝,以便我可以接受它? – kentor

回答

1

不確定您對此方法的看法,但您也可以將值附加到架構字段,稍後可以通過選項對象引用它們。

例如,我添加了別名作爲街道和郵編的屬性。

let userSchema = mongoose.Schema({ 
    ... 
    addresses: [{ 
     street: { 
      type: String, 
      required: true, 
      **alias**: "fdn" 
     }, 
     zip: { 
      type: Number, 
      required: true, 
      **alias**: "dq" 
     } 
    }], 
}) 

然後可以通過貓鼬參考。檢查調試控制檯中星號包圍的字段是否有結構。

mongoose.models.**UserSchema**.schema.paths.**addresses.street**.options.alias 

然後,您可以在循環中使用它來查找模式屬性的其他名稱。

+0

上的靜態函數。這聽起來也很有趣,有什麼缺點嗎? – kentor

+0

它像任何其他鍵/值對一樣附加到您的模式對象,但爲了安全起見,我會確保給它一個唯一的名稱,以便將來證明貓鼬更新到選項對象。好處是您可以通過require('mongoose')從代碼的任何部分引用它。所以如果您決定將所有模式中的所有映射代碼整合到一個模塊中,則可以通過此方法訪問它。 – Nuspeed1

相關問題