如何判断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
相关产品推荐
相关产品推荐

