MongoDB更新后使用for循环获取最新数据的问题求助
问题解决:findOneAndUpdate返回旧数据导致打印状态未更新
问题核心在于MongoDB的findOneAndUpdate方法默认会返回更新前的原始文档,所以你拿到的updatedUser是更新前的旧数据,自然循环打印的还是pending状态。
解决方法很简单,在findOneAndUpdate的选项参数里添加new: true,让它返回更新后的最新文档。另外注意你代码里的查询条件有个笔误:"client._id"应该是"clients._id"(复数形式,因为你的字段是clients数组),这个错误可能导致查询匹配失败,建议一起修正。
修改后的完整代码片段:
router.put("/:id", upload.single('doc_upload'), async(req,res)=>{ try{ // 修正查询条件字段名,添加new: true选项 const updatedUser = await User.findOneAndUpdate( { "clients._id": req.params.id, "clients.documents._id": req.body.doc_id }, { "$set": {"clients.$[clientFilter].documents.$[documentFilter].status": "uploaded"} }, { arrayFilters: [ {"clientFilter._id": req.params.id}, {"documentFilter._id": req.body.doc_id} ], new: true // 关键配置:返回更新后的最新文档 } ); // 现在循环打印的就是更新后的状态了 for (let i=0; i < updatedUser.clients.length; i++) { if (updatedUser.clients[i]._id == req.params.id) { for (let j=0; j < updatedUser.clients[i].documents.length; j++) { console.log("this is the status of all my docs" + updatedUser.clients[i].documents[j].status) } } } res.send(req.file) } catch(err){ res.status(500).json(err); } })
补充说明:
new: true是MongoDB驱动和Mongoose都支持的选项,作用就是让更新方法返回修改后的文档,而非原始文档。- 修正
"clients._id"字段是因为你的数据结构里是clients数组,单数client会导致查询不到目标文档,可能之前的更新能生效是因为后面的clients.documents._id条件匹配,但为了严谨还是修正为复数。
内容的提问来源于stack exchange,提问作者Vaodi
相关产品推荐
相关产品推荐

