2017-07-29 200 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

相关问题