Express Put方法中MongoDB upsertedId为null的问题求助
问题排查:MongoDB Upsert操作无匹配无插入的原因
1. 核心错误:参数拼写错误
你在options对象里把MongoDB的upsert参数拼错了——写成了upsurt,正确的参数名是upsert(少了字母e)。因为参数名不匹配,MongoDB无法识别你的upsert需求,所以既不会更新现有文档,也不会插入新文档,最终返回全0的计数结果。
修正后的代码片段:
const options = { upsert: true }; // 修正拼写错误
2. 潜在逻辑问题(修正拼写后需注意)
你的更新逻辑存在字段覆盖的冗余:
- 筛选条件
filter指定匹配email: "sabbir195661@gmail.com"的文档 - 更新语句
updateDoc又用$set把email改成"mukit"
如果数据库中存在匹配文档,执行后该文档的email会被覆盖;如果upsert生效(修正拼写后),无匹配时会插入一个email为mukit的新文档(因为MongoDB会先基于filter创建基础文档,再应用$set的修改)。如果你的需求是插入指定email的新文档,可以直接调整updateDoc的逻辑,避免这种冗余的字段覆盖。
3. 修正后的预期结果
修正拼写错误后执行代码:
- 若存在匹配文档:返回
matchedCount: 1, modifiedCount: 1 - 若不存在匹配文档:返回
upsertedCount: 1, upsertedId: ObjectId("xxx")
内容的提问来源于stack exchange,提问作者Sabbir Ahmed
相关产品推荐
相关产品推荐

