$currentDate
定义
$currentDate
的
$currentDate
运算符将字段的值设置为当前日期,可以是日期或时间戳。默认类型是日期。
兼容性
您可以使用$currentDate
在以下环境中进行部署
MongoDB Atlas:云中MongoDB部署的完全托管服务
MongoDB Enterprise:基于订阅的MongoDB自托管版本
MongoDB Community:源代码可用、免费使用和自托管的MongoDB版本
语法
运算符 $currentDate
的形式是
{ $currentDate: { <field1>: <typeSpecification1>, ... } }
<typeSpecification>
可以是
布尔值
true
将字段值设置为当前日期作为日期,或者一个文档
{ $type: "timestamp" }
或{ $type: "date" }
明确指定类型。运算符是 区分大小写的,只接受小写的"timestamp"
或小写的"date"
。
要指定嵌入式文档或数组中的 <field>
,请使用 点表示法。
行为
从 MongoDB 5.0 开始,更新运算符按基于字符串的名称的字典顺序处理文档字段。具有数字名称的字段按数字顺序处理。有关详细信息,请参阅 更新运算符行为。
$currentDate
将指定字段设置为 $currentDate
被运行时的日期。
如果字段不存在,$currentDate
将字段添加到文档中。
从 MongoDB 5.0 开始,mongod
在使用 $currentDate
等更新运算符与空操作数表达式({ }
)时不再引发错误。空更新不会导致更改,也不会创建 操作日志 条目(这意味着操作是 no-op)。
示例
创建一个名为 customers
的样本集合,包含以下文档
db.customers.insertOne( { _id: 1, status: "a", lastModified: ISODate("2013-10-02T01:11:18.965Z") } )
以下操作将更新 lastModified
字段为当前日期,"cancellation.date"
字段为当前时间戳,并将 status
字段更新为 "D"
,将 "cancellation.reason"
更新为 "user request"
。
db.customers.updateOne( { _id: 1 }, { $currentDate: { lastModified: true, "cancellation.date": { $type: "timestamp" } }, $set: { "cancellation.reason": "user request", status: "D" } } )
$currentDate
将指定字段设置为 $currentDate
被运行时的日期。
验证更新
db.customers.find()
更新的文档如下
{ "_id" : 1, "status" : "D", "lastModified" : ISODate("2020-01-22T21:21:41.052Z"), "cancellation" : { "date" : Timestamp(1579728101, 1), "reason" : "user request" } }
lastModified
字段设置为在更新示例中之前运行的 $currentDate
时所运行的日期。
相对于 $currentDate
的聚合替代方案
更新方法可以接受一个聚合管道。具体来说,前面的示例可以使用聚合阶段 $set
和聚合变量 NOW
(当前日期时间)以及 CLUSTER_TIME
(当前时间戳)重写为以下内容
提示
要访问聚合变量,请在变量前加双美元符号
$$
并用引号括起来。CLUSTER_TIME
仅在副本集和分片集群中可用。NOW
和CLUSTER_TIME
的值在整个管道中保持不变。
db.customers.updateOne( { _id: 1 }, [ { $set: { lastModified: "$$NOW", cancellation: {date: "$$CLUSTER_TIME", reason: "user request"}, status: "D" } } ] )
操作完成后,您可以查询集合以验证更新
db.customers.find().pretty()
查询应返回以下文档
{ "_id" : 1, "status" : "D", "lastModified" : ISODate("2020-01-22T21:02:18.994Z"), "cancellation" : { "date" : Timestamp(1579726934, 2), "reason" : "user request" } }