You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中实现对象映射,完成MongoDB数据到应用对象的转换

解决方案

工具选择

你列出的三个工具中,object-mapper 是目前通用度、受欢迎度最高的选择,周下载量超过10万,生态成熟、入门门槛低,是新手的首选。另外两款工具更适配TypeScript复杂类型序列化的场景,如果你没有嵌套类型转换、自定义序列化规则这类复杂需求,不需要使用,学习成本相对更高。

你的核心需求是把MongoDB中存储的蛇形命名字段,映射为应用层使用的驼峰命名字段,对应映射规则如下:

  • 库内country_code → 应用层countryCode
  • 库内country_iso → 应用层countryIso
  • 库内origination_prefix → 应用层destinationPrefix
  • 库内voice_rate_in_usd → 应用层voiceRate
  • 库内voice_unit_in_seconds → 应用层voiceUnit
  • country字段直接保留,_id可根据需求选择保留或过滤

使用object-mapper的实现步骤

1. 安装依赖

# 安装核心包
npm install object-mapper
# TypeScript项目额外安装类型定义
npm install @types/object-mapper -D

2. 定义映射规则

import mapper from 'object-mapper'

// 定义数据库字段到应用字段的映射模板
const dbToAppMapping = {
  "country": "country",
  "country_code": "countryCode",
  "country_iso": "countryIso",
  "origination_prefix": "destinationPrefix",
  "voice_rate_in_usd": "voiceRate",
  "voice_unit_in_seconds": "voiceUnit",
  // 如果需要保留文档ID可打开下面的注释
  // "_id": "id"
}

3. 调整接口逻辑

router.get("", async (req, res) => {
  // 加lean()直接返回纯JS对象,比默认返回Mongoose模型实例性能更高,也更适配映射逻辑
  const dbPrices = await pricesModel.find().limit(10).lean();
  // 批量转换字段格式
  const appPrices = dbPrices.map(item => mapper(item, dbToAppMapping));
  res.send(appPrices);
});

轻量方案:无依赖手动映射

如果你的集合字段数量不多,也可以不引入第三方依赖,直接写转换函数实现映射,逻辑更透明易维护:

// 定义转换函数
const mapDbToApp = (dbItem: any): Pricing => {
  return {
    country: dbItem.country,
    countryCode: dbItem.country_code,
    countryIso: dbItem.country_iso,
    destinationPrefix: dbItem.origination_prefix,
    voiceRate: dbItem.voice_rate_in_usd,
    voiceUnit: dbItem.voice_unit_in_seconds
  }
}

// 接口中直接调用
router.get("", async (req, res) => {
  const dbPrices = await pricesModel.find().limit(10).lean();
  const appPrices = dbPrices.map(mapDbToApp);
  res.send(appPrices);
});

内容的提问来源于stack exchange,提问作者Kgn-web

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:18:03