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

如何通过Mongoose向mongo-unit导入含ObjectId的测试数据?

生产JSON数据导入mongo-unit测试环境的查询问题

背景

我有一批从生产数据库导出的JSON数据,用于排查Bug,已存放至test/fixture/data目录。需要将这些数据导入由mongo-unit创建的MongoDB实例中,基于Mongoose 5.10.1版本搭建Node.js应用的单元测试环境。

但始终无法以被测代码可查询的方式导入数据(注:通过Compass将数据导入本地MongoDB服务器时,单元测试可正常运行)。

调研的组合方案

我调研了2种数据加载方式和3种ObjectId处理方式,共6种组合:

基础代码

const my_data = require('./fixture/data/my_data.json');
export default mongoose.model('my_data', TheSchema);

加载方式

  • await importedSchema.insertMany(my_data, function(err,result) {...});
  • await mongoUnit.load(my_data);(注:使用此方式时,JSON数据需用集合名包裹,格式为{"my_data": [...]})

ObjectId处理方式

  • "_id": ObjectId("abc...def"),
  • "_id": { "$oid": "abc...def" },
  • "_id": "abc...def",

各组合测试结果

  • insertMany()+ObjectId格式:JSON语法错误,提示Unexpected token 'O'
  • insertMany()+"$oid"格式:CastError,无法将{ '$oid': 'xxx' }转换为ObjectId,同时created_date字段也无法转换为日期类型
  • insertMany()+字符串格式:created_date字段转换日期失败
  • mongoUnit.load()+ObjectId格式:同insertMany()的JSON语法错误
  • mongoUnit.load()+"$oid"格式:MongoBulkWriteError,提示_id字段不能包含$前缀的字段
  • mongoUnit.load()+字符串格式:数据可成功导入,但被测代码查询不到数据。通过mongosh查询发现,用ObjectId("abc...def")查询无结果,用字符串"abc...def"可查到数据,但被测代码中使用{ "_id": ObjectId(xId) }进行查询,因此查询结果为空。

内容的提问来源于stack exchange,提问作者Stewart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:55:11