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

如何判断MongoDB updateOne()执行的是更新还是插入操作?

如何判断MongoDB updateOne()开启upsert:true时是更新还是插入?

我参考相关内容后,仍无法判断MongoDB updateOne()方法在开启upsert: true时执行的是更新还是插入操作。我的代码如下:

let updateResult = await myDB.updateOne(
    searchKey,
    newData,
    { upsert: true }
);

执行后返回的updateResult为:

{ n: 1, nModified: 1, ok: 1 }

nModified字段无法明确指示操作是更新还是插入,不清楚其具体含义。当前环境信息:

$ mongod --version
db version v4.4.18
Build Info: {
    "version": "4.4.18",
    "gitVersion": "8ed32b5c2c68ebe7f8ae2ebe8d23f36037a17dea",
    "openSSLVersion": "OpenSSL 1.1.1f  31 Mar 2020",
    "modules": [],
    "allocator": "tcmalloc",
    "environment": {
        "distmod": "ubuntu2004",
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}
"mongoose": "^5.10.13"

解决方案

在MongoDB 4.x版本(含你使用的4.4.18)搭配Mongoose 5.x时,可通过返回结果的特定字段区分操作类型:

  • 核心判断依据:upsertedId字段
    执行插入操作时,返回结果会包含upsertedId字段,值为新插入文档的_id;执行更新操作时,该字段不存在。
  • 辅助字段组合验证
    • 插入操作:n为1,nModified为0,同时存在upsertedId(部分驱动版本返回upserted数组)。
    • 更新操作:n为1,nModified为1(文档内容被实际修改)或0(更新内容与原文档完全一致),且无upsertedId字段。

你当前返回的{ n: 1, nModified: 1, ok: 1 }属于更新操作——因为没有upsertedId,且nModified为1说明有文档被修改。

实际代码中可直接通过upsertedId判断:

if (updateResult.upsertedId) {
  console.log('执行的是插入操作');
} else {
  console.log('执行的是更新操作');
}

补充说明nModified的含义:该字段表示被实际修改的文档数量。如果更新内容和原文档完全一致,即使匹配到文档,nModified也会是0,但此时依然属于更新操作,而非插入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:40:35