$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" } }