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

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 } }
    );
  },
};

验证步骤

  1. 执行迁移脚本后,检查数据库中目标文档的 promotedAt 字段是否更新
  2. 如果还是没生效,可以在 updateOne 后打印返回结果,查看匹配的文档数:
    const result = await db.collection("users").updateOne(...);
    console.log('匹配文档数:', result.matchedCount, '更新文档数:', result.modifiedCount);
    
    如果 matchedCount 为 0,说明查询条件不匹配,重点检查 _id 的类型和值是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:16:09