如何在MongoDB中更新review集合文档的expiry字段为原日期减1天
MongoDB 更新review集合文档expiry字段(原值减1天)
根据当前使用的MongoDB版本,可选择以下对应方案实现:
MongoDB 5.0及以上版本(推荐)
5.0版本新增了原生日期计算运算符$dateSubtract,配合4.2版本开始支持的聚合管道更新能力,可以直接在更新语句中读取原字段值完成计算,无需提前查询文档。
批量更新集合内所有文档的命令如下:db.review.updateMany( // 过滤条件:空对象表示匹配集合所有文档 {}, [ { $set: { // 原expiry值基础上减去1天 expiry: { $dateSubtract: { startDate: "$expiry", unit: "day", amount: 1 } }, // 可选:同步更新修改时间为当前时间 modifiedTime: "$$NOW" } } ] )如果仅需要更新你示例中指定
_id的单条文档,把第一个参数的过滤条件替换为对应_id匹配即可:{ _id: ObjectId("62bd783086e0ee2176477b93") }MongoDB 4.2 ~ 4.4版本
该版本区间支持聚合管道更新,但没有$dateSubtract运算符,可以通过毫秒数计算实现日期偏移:1天对应毫秒数为86400000,更新命令如下:db.review.updateMany( // 替换为你的过滤条件 {}, [ { $set: { expiry: { $subtract: ["$expiry", 86400000] }, modifiedTime: "$$NOW" } } ] )MongoDB 4.2以下版本
低版本不支持在更新语句中直接引用文档原有字段做计算,需要先查询出所有待更新文档,逐条计算新日期后再执行更新,mongo shell下实现示例:// 遍历所有匹配过滤条件的文档 db.review.find({}).forEach(doc => { // 计算减1天后的日期值 const newExpiry = new Date(doc.expiry.getTime() - 24 * 60 * 60 * 1000) // 执行单条更新 db.review.updateOne( { _id: doc._id }, { $set: { expiry: newExpiry, modifiedTime: new Date() } } ) })
操作提示:执行批量更新前,建议先把
updateMany替换为find()执行,确认返回的文档范围符合预期,避免误修改不需要调整的数据。
内容的提问来源于stack exchange,提问作者Nishank Jain
相关产品推荐
相关产品推荐

