MongoDB调用findOneAndUpdate返回旧文档问题求助
解决findOneAndUpdate返回旧文档的问题
嘿,我帮你排查了下代码,问题主要出在两个地方,咱们一步步来理:
1. 没有使用MongoDB更新操作符,导致更新逻辑错误
你现在的update对象是{ data },也就是{ data: { fullName: "John" } },这种写法会直接替换整个匹配到的文档,而不是更新指定字段。如果更新逻辑没正确触发,就可能返回旧文档。
正确的做法是用$set操作符来指定要更新的字段,这样只会修改你需要的部分,不会覆盖文档里的其他原有字段:
const update = { $set: data }; // 直接把data里的字段合并到目标文档,而非嵌套在data字段下
2. 注意options参数的兼容性(驱动版本差异)
如果你用的是Mongoose,options里的new: true是正确的,它会让方法返回更新后的文档;但如果你用的是原生MongoDB Node.js驱动,这个参数要换成returnDocument: 'after'——原生驱动不识别new这个选项。
修正后的完整代码(Mongoose版本)
router.post("/user-add-change", (req, res, next) => { const data = { fullName: "John" }; const query = { googleId: "11288970sdvsdv724402783" }; const update = { $set: data }; // 使用$set操作符 const options = { new: true, upsert: true }; User.findOneAndUpdate(query, update, options, function(err, doc) { if (err) { console.error(err); return res.status(500).send(err); } console.log("更新后的文档:", doc); res.send(doc); }); });
修正后的完整代码(原生MongoDB驱动版本)
// 假设你已获取对应collection对象 router.post("/user-add-change", (req, res, next) => { const data = { fullName: "John" }; const query = { googleId: "11288970sdvsdv724402783" }; const update = { $set: data }; const options = { returnDocument: 'after', upsert: true }; // 替换为原生驱动支持的参数 User.findOneAndUpdate(query, update, options) .then(doc => { console.log("更新后的文档:", doc); res.send(doc); }) .catch(err => { console.error(err); res.status(500).send(err); }); });
另外提一句,你代码里的console.log(doc.fullName =...);应该是笔误,改成打印doc或者doc.fullName就能看到正确结果啦。
内容的提问来源于stack exchange,提问作者jsDev
相关产品推荐
相关产品推荐

