MongoDB Upsert后如何直接返回更新后的count值?避免二次查询
MongoDB 更新文档后直接返回结果,避免额外查询
问题场景
需要更新analytics集合中指定文档的count字段(递增1),同时直接返回更新后的完整文档,不想通过额外的findOne查询实现。当前代码中usage变量未赋值,只能先执行updateOne再调用findOne获取结果,希望优化为单次操作完成更新+返回。
当前两次数据库操作的实现:
handler.put(async (req, res) => { console.log("in backend api to update geo count") await req.db.collection('analytics').updateOne( { _id: getDateMonYear(new Date(), "mmddyyyy"), type: "Geo", }, { $inc: { "count": 1} }, { upsert: true } ); // 额外查询获取结果 const usage = await req.db.collection('analytics').findOne( { _id: getDateMonYear(new Date(), "mmddyyyy") } ); res.json({status:200, usage}); });
预期返回格式:
{ "_id": "Sept292022", "type": "Geo", "count": 162 }
解决方案:使用findOneAndUpdate替代updateOne
MongoDB的findOneAndUpdate方法支持在更新操作完成后直接返回目标文档,通过配置returnDocument: 'after'选项即可拿到更新后的文档,无需额外查询。
修改后的单次操作代码:
handler.put(async (req, res) => { console.log("in backend api to update geo count") // 用findOneAndUpdate完成更新+返回结果 const usage = await req.db.collection('analytics').findOneAndUpdate( { _id: getDateMonYear(new Date(), "mmddyyyy"), type: "Geo", }, { $inc: { "count": 1} }, { upsert: true, // 保留原有的「不存在则插入」逻辑 returnDocument: 'after' // 指定返回更新后的最新文档 } ); res.status(200).send({ usage }); });
关键参数说明
returnDocument: 'after':默认值为'before'(返回更新前的文档),设置为'after'后会返回更新完成后的最新文档。upsert: true:保持原有逻辑,当查询条件匹配不到文档时,自动插入符合条件的新文档。
这样就可以通过单次数据库操作完成更新并返回结果,避免了额外的查询开销。
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

