我已经创建了一个应该保存来自第三方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