如何让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等),不需要写任何自定义转换逻辑。
- 安装依赖:
npm install bson
- 替换原生
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.
相关产品推荐
相关产品推荐

