如何用Mongoose更新对象?仅筛选含msgId属性的文档
当然可以实现!
完全没问题,MongoDB 提供了$exists查询操作符,专门用来筛选存在特定字段的文档,正好能满足你的需求——只对拥有msgId属性的文档执行更新操作。
为什么当前代码会匹配无msgId的文档?
你现在的查询条件{'msgId': id}会意外匹配到没有msgId字段的文档:因为MongoDB中,当你查询某个字段等于null时,会同时包含两种情况:字段存在但值为null,或者字段根本不存在。而你的Schema里msgId默认值是null,但目前所有文档都没有这个字段,所以当前代码会尝试匹配所有文档(虽然更新不会生效,但逻辑上不符合你的预期)。
修改后的代码实现
只需要在查询条件中加入$exists: true,就能精准锁定拥有msgId字段的文档:
exports.updateStatusOfMsg = (req, res) => { let id = req.body.messageId; interactions.findOneAndUpdate( // 仅匹配存在msgId字段且值等于目标id的文档 { msgId: { $exists: true, $eq: id } }, {$set: {status: req.body.status}}, {new: true}, (err, doc) => { if (err) { console.log("Error occurred: ", err); // 建议补充错误响应,让前端能及时感知问题 return res.status(500).json({success: false, error: err.message}); } console.log("Updated document: ", doc); // 补充成功响应 res.status(200).json({success: true, updatedDocument: doc}); }); }
可选的严格校验(针对msgId为null的情况)
如果你的业务场景中,需要排除那些*存在msgId但值为null*的文档(毕竟Schema里msgId默认是null),可以再添加$ne: null条件,进一步缩小匹配范围:
{ msgId: { $exists: true, $eq: id, $ne: null } }
这样修改后,由于你目前所有文档都没有msgId字段,执行这个接口不会对任何文档进行更新;只有当后续有文档添加了msgId字段且值匹配目标id时,才会触发更新操作,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Raza Ellahi
相关产品推荐
相关产品推荐

