如何让Mongoose加载JSON时自动解析$oid为ObjectId?
解决Mongoose解析$oid格式ObjectId的问题
下面提供几种实用方案,帮你把JSON里的$oid格式转换成Mongoose可识别的ObjectId类型:
方法一:手动递归转换所有$oid字段
写一个递归函数遍历JSON数据,自动把带$oid属性的对象转为ObjectId:
const mongoose = require('mongoose'); function convertOidFields(obj) { if (typeof obj !== 'object' || obj === null) return obj; // 匹配$oid格式的对象 if (obj.$oid && typeof obj.$oid === 'string') { return mongoose.Types.ObjectId(obj.$oid); } // 递归处理数组元素 if (Array.isArray(obj)) { return obj.map(item => convertOidFields(item)); } // 递归处理嵌套对象的每个字段 for (const key in obj) { obj[key] = convertOidFields(obj[key]); } return obj; } // 使用示例 const testData = require('./your-test-data.json'); const processedData = convertOidFields(testData); const doc = new MyModel(processedData); // 此时doc._id及其他带$oid的字段均为ObjectId类型
方法二:利用bson库自动解析
MongoDB的bson库(Mongoose已内置依赖)可直接处理这种Extended JSON格式,通过序列化再反序列化自动转换特殊格式:
const { BSON } = require('bson'); const mongoose = require('mongoose'); const jsonData = require('./your-test-data.json'); // 先转BSON再转回JS对象,自动处理$oid、$date等MongoDB特殊格式 const parsedData = BSON.deserialize(BSON.serialize(jsonData)); const doc = new MyModel(parsedData);
方法三:给Schema字段添加自定义setter
如果仅需处理特定字段,可在Schema对应字段上设置setter函数,自动转换传入的$oid格式:
const mySchema = new mongoose.Schema({ _id: { type: mongoose.Schema.Types.ObjectId, set: (value) => { if (value?.$oid) { return mongoose.Types.ObjectId(value.$oid); } return value; } }, // 其他需要处理$oid的字段可添加相同逻辑 relatedDocId: { type: mongoose.Schema.Types.ObjectId, set: (value) => { if (value?.$oid) { return mongoose.Types.ObjectId(value.$oid); } return value; } } }); const MyModel = mongoose.model('MyModel', mySchema); // 直接传入带$oid的对象即可自动转换 const doc = new MyModel({ "_id": {"$oid": "6457a66965cfa04f2c2bf00f"}, "relatedDocId": {"$oid": "6457a66965cfa04f2c2bf010"} });
内容的提问来源于stack exchange,提问作者Stichiboi
相关产品推荐
相关产品推荐

