Mongoose中设置includeResultMetadata后如何读取findOneAndUpdate结果?
Mongoose
findOneAndUpdate 返回的 ModifyResult 字段解析与场景判断 返回对象各字段详解
你拿到的ModifyResult对象里每个字段都对应着操作的关键状态,逐个拆解:
ok: 标识MongoDB操作本身是否成功完成,1代表成功,0代表操作失败(比如数据库连接异常、语法错误、权限问题等)lastErrorObject: 存储操作的核心元数据:n: 受操作影响的文档数量。0表示无文档被匹配或修改;1表示有1个文档被更新或插入(upsert)updatedExisting: 布尔值,true表示更新了已存在的文档,false表示触发了upsert(插入新文档)upserted: 仅在updatedExisting为false时存在,是新插入文档的_id值
value: 返回的目标文档。如果设置了new: true,这里是更新后的文档;没设置的话是更新前的文档。如果没匹配到文档且未触发upsert,value为null
三种场景的判断逻辑
1. 未找到匹配记录
判断条件:
lastErrorObject.n === 0value === nullok === 1
说明:查询条件没匹配到任何文档,且你没设置upsert: true,所以既没更新也没插入新文档。
2. 找到匹配记录但更新失败
判断条件:
ok === 0- 或者
lastErrorObject.n === 0但value不为null(这种情况少见,一般是更新内容和原文档完全一致,或者字段验证不通过)
说明:ok为0意味着操作执行时出错;如果n为0但value存在,说明匹配到了文档,但更新操作没产生实际变化。
3. 更新成功(含upsert插入)
分两种情况:
- 更新已有文档成功:
ok === 1lastErrorObject.updatedExisting === truelastErrorObject.n === 1value为更新后的文档(记得要设置new: true才能拿到更新后的内容)
- Upsert插入新文档成功:
ok === 1lastErrorObject.updatedExisting === falselastErrorObject.upserted存在(即新文档的_id)value为刚插入的新文档
内容的提问来源于stack exchange,提问作者rajan_saini.98
相关产品推荐
相关产品推荐

