migrate-mongo v10.0.0中updateOne无报错但无法更新文档问题
问题原因与解决方案
核心问题:未等待异步操作完成
MongoDB 的 updateOne 是异步方法,返回 Promise,但你的迁移脚本里没有用 await 等待它执行完毕。migrate-mongo 的 up/down 函数是异步函数,脚本会在异步操作完成前就结束,导致数据库更新根本没实际执行。
而 updateMany 看似正常工作只是巧合,本质上也是不规范的写法,同样需要添加 await 保证执行完成。
次要可能:_id 类型不匹配
MongoDB 文档的 _id 默认是 ObjectId 类型,而你代码里用的是字符串格式的 ID。如果数据库里的 _id 是 ObjectId,用字符串匹配会找不到目标文档,自然不会有更新。
修正后的代码
const { ObjectId } = require('mongodb'); module.exports = { async up(db, client) { // 等待 updateOne 执行完成,同时转换 _id 为 ObjectId 类型 await db.collection("users").updateOne( { _id: new ObjectId("63918aa70e345d3c60b740c3") }, { $set: { promotedAt: 1234567890 } } ); }, async down(db, client) { await db.collection("users").updateOne( { _id: new ObjectId("63918aa70e345d3c60b740c3") }, { $set: { promotedAt: null } } ); }, };
验证步骤
- 执行迁移脚本后,检查数据库中目标文档的
promotedAt字段是否更新 - 如果还是没生效,可以在
updateOne后打印返回结果,查看匹配的文档数:
如果const result = await db.collection("users").updateOne(...); console.log('匹配文档数:', result.matchedCount, '更新文档数:', result.modifiedCount);matchedCount为 0,说明查询条件不匹配,重点检查_id的类型和值是否正确。
内容的提问来源于stack exchange,提问作者Giorgi Janelidze
相关产品推荐
相关产品推荐

