如何为MongoDB旧数据添加默认值为当前日期的createdAt和updatedAt字段?
给MongoDB旧数据添加createdAt和updatedAt字段的解决方案
没问题,我帮你整理了几种实用的MongoDB查询语句,用来给从CSV导入的旧数据添加createdAt和updatedAt字段,默认值设为当前日期:
方法1:批量更新所有缺少字段的文档(推荐用服务器时间)
这个方法用$currentDate操作符,会把字段设置为MongoDB服务器端的当前ISODate,避免客户端和服务器时区不一致的问题,同时只更新没有createdAt字段的文档:
db.yourCollection.updateMany( { createdAt: { $exists: false } }, // 匹配所有没有createdAt的文档 { $currentDate: { createdAt: true, updatedAt: true } } )
把yourCollection替换成你的实际集合名称即可。如果有些文档已经有createdAt但缺少updatedAt,可以调整查询条件来覆盖这种情况:
db.yourCollection.updateMany( { $or: [ { createdAt: { $exists: false } }, { updatedAt: { $exists: false } } ]}, { $currentDate: { createdAt: true, updatedAt: true } } )
方法2:仅添加不存在的字段(不修改已有字段)
如果你的数据里可能有部分文档已经存在其中一个字段,不想覆盖已有值,可以用聚合表达式(MongoDB 3.6+支持)来只给缺失的字段赋值:
db.yourCollection.updateMany( {}, // 匹配所有文档 [ { $set: { createdAt: { $cond: [{ $not: [{ $exists: ["$createdAt"] }] }, new Date(), "$createdAt"] }, updatedAt: { $cond: [{ $not: [{ $exists: ["$updatedAt"] }] }, new Date(), "$updatedAt"] } } } ], { multi: true } )
这个语句会检查每个文档的字段是否存在,不存在的话就设置为当前客户端时间,存在则保留原有值。
小提示
- 如果你用的是MongoDB Compass客户端,直接把这些代码粘贴到"聚合"或"更新"面板里执行即可
- 执行前可以先用
find语句测试匹配条件是否正确,比如db.yourCollection.find({ createdAt: { $exists: false } }),确认要更新的文档数量
内容的提问来源于stack exchange,提问作者d3vjamal
相关产品推荐
相关产品推荐

