如何在MongoDB(pymongo)中仅在文档修改时设置更新时间戳?
仅在文档实际修改时同步更新update_at字段
假设你执行以下MongoDB更新操作:
my_collection.update_one({...}, { "$set": { "title": "Title 1" } })
需要实现:仅当文档确实被修改(即modified_count > 0)时,在同一请求中自动添加或更新update_at字段为当前日期。
解决方案
利用MongoDB 4.2+支持的聚合管道式更新,通过条件判断字段是否发生变化,就能在同一原子操作中实现需求:
my_collection.update_one( {...}, # 你的文档查询匹配条件 [ { "$set": { "title": "Title 1", "update_at": { "$cond": [ # 判断原title值与新值是否不同 {"$ne": ["$title", "Title 1"]}, # 不同则设置为当前日期 {"$currentDate": {"$type": "date"}}, # 相同则保留原update_at值(无此字段时不新增) "$update_at" ] } } } ] )
原理说明
- 聚合管道式更新允许在更新逻辑中使用聚合表达式做条件判断,替代传统的键值对更新文档
$cond表达式会检查原文档的title是否等于新设置的"Title 1":- 若不等,说明
title会被修改,此时$currentDate会生成当前UTC日期赋值给update_at - 若相等,说明
title无变化,modified_count会返回0,此时update_at字段保持原有值(不存在则不创建)
- 若不等,说明
- 整个操作是原子性的,完全在单个
update_one请求中完成,无需额外的二次请求判断
内容的提问来源于stack exchange,提问作者Alex Burla
相关产品推荐
相关产品推荐

