我已經創建了一個應該保存來自第三方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
}
}],
})
我的問題:
- 什麼將這些愚蠢的原始名稱到我的模式字段名稱映射的最佳方法?
- 我應該簡單地創建一個輔助函數還是有一個我可以用於這個「映射過程」的貓鼬特徵?
- 我經常看到使用camelCase命名字段的API,但mongodb更喜歡snake_case。我應該忽略mongodb命名約定,以便我不需要這樣的「映射」?
聽起來像你將不得不以任何方式創建一個地圖。現在要做到這一點很重要。 1&2,你可以通過鉤入userSchema.pre('validate',function(){})在貓鼬中間件級別執行它。在它上行到保存之前,映射到正確的字段。確保刪除你不想在你的數據庫中顯示的字段。 3,是一個偏好問題。如果這是你的代碼,你的構建,我不明白你爲什麼不能使用首選的命名方案。 – Nuspeed1
您可以嘗試的另一種方法是在架構的靜態函數中實現映射器。通過此功能運行每個新字段並返回正確的文檔。 userSchema.statics.map = function(apiObject){//映射東西,返回映射對象}。這樣,傳入的apiResponse數據和映射功能就保留在userSchema的範圍內。 – Nuspeed1
@ Nuspeed1我假設我想使用pre('validate'),這樣我的驗證器(如required)會檢查。如果你可以給出一個快速的代碼示例,你可以把它作爲答案來包裝,以便我可以接受它? – kentor