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

如何让Mongoose insertMany自动转换MongoDB扩展JSON的$oid、$date类型

Mongoose 本身没有内置全局自动识别 MongoDB 扩展 JSON(即带$oid、$date等BSON扩展标识的导出格式)的开关,但有两种方案可以避免手动编写全量遍历转换的脚本:

方案1:用MongoDB官方bson包的EJSON解析能力(最简便,推荐)

MongoDB 官方提供的bson包自带EJSON解析工具,天生支持识别所有MongoDB扩展JSON的特殊格式,直接转换为对应原生JS类型(ObjectId、Date、Binary等),不需要写任何自定义转换逻辑。

  1. 安装依赖:
npm install bson
  1. 替换原生JSON.parse为EJSON.parse:
const { EJSON } = require('bson');
const fs = require('fs');

const rawData = fs.readFileSync('./data.json', 'utf8');
// 直接完成所有$oid、$date等特殊字段的转换
const parsedData = EJSON.parse(rawData);

await model.insertMany(parsedData);

方案2:使用Mongoose Schema自定义cast逻辑(仅用Mongoose自身功能,无需额外依赖)

如果不想引入额外依赖,可以在Schema对应字段上配置自定义类型转换规则,Mongoose插入数据时会自动执行转换:

const mongoose = require('mongoose');

const yourSchema = new mongoose.Schema({
  _id: {
    type: mongoose.Types.ObjectId,
    cast: (val) => {
      if (val && typeof val === 'object' && '$oid' in val) {
        return new mongoose.Types.ObjectId(val.$oid);
      }
      return val;
    }
  },
  field: {
    due_date: {
      type: Date,
      cast: (val) => {
        if (val && typeof val === 'object' && '$date' in val) {
          return new Date(val.$date);
        }
        return val;
      }
    }
  }
  // 其他字段配置
});

const model = mongoose.model('YourModel', yourSchema);
// 后续直接调用insertMany即可自动转换
await model.insertMany(JSON.parse(fs.readFileSync('./data.json').toString()))

该方案的缺点是需要为每一个可能出现扩展格式的字段单独配置cast规则,字段较多时不如EJSON方案便捷。

内容的提问来源于stack exchange,提问作者J.F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:06:06