向已创建的文档添加日期类型
Posted
技术标签:
【中文标题】向已创建的文档添加日期类型【英文标题】:Adding date type to the documents already created 【发布时间】:2020-12-13 03:18:42 【问题描述】:我的猫鼬模式定义如下。
mongoose.Schema(
"url": String,
"translations": [
"targetLang": String,
"source": String,
"target": String
],
, versionKey: false );
我更新了架构以包含 createdAt
和 updatedAt
,新架构如下所示:
mongoose.Schema(
"url": String,
"translations": [
"targetLang": String,
"source": String,
"target": String,
"createdAt": type: Date, default: Date.now ,
"updatedAt": type: Date, default: Date.now
],
, versionKey: false );
因此,当创建新文档时,createdAt
和 updatedAt
会按预期自动填充。如何使用新密钥 createdAt
和 updatedAt
获取旧文档。有什么办法吗?
注意:我可以将旧文档保留为当前日期或之前的任何日期。但我希望他们都有个约会。
【问题讨论】:
可以查看这个问题的答案,从文档的ObjectId中提取创建日期:***.com/questions/7327296/… @makmonty 我可以接受旧文档有任何旧日期,而不必寻找确切的创建日期,因为数组会被更新多次。 我认为用一个命令是不可能的,你必须编写一些脚本来实现这一点。 【参考方案1】:您需要手动更新它们,例如从 mongoshell:
const toUpdate = db.getCollection('collection').find(
$or: [
'translations.createdAt': null ,
'translations.updatedAt': null
]
);
toUpdate.forEach(doc =>
const timestamp = doc._id.getTimestamp();
doc.translations.createdAt = timestamp;
doc.translations.updatedAt = timestamp;
db.getCollection('collection').updateOne( _id: doc._id , $set: doc );
);
【讨论】:
@Amanda 的问题是文档嵌套在子数组中,而不是在顶层。此代码会将 createdAt 和 updatedAt 添加到每个文档的顶层。 你能推荐一种使用猫鼬的方法吗? 这是一次性修复,为什么要将它包含在您的代码库中?无论如何,我认为它也应该适用于猫鼬,如果你去掉外花括号 当translations
内部发生更新时,有没有办法自动更新updatedAt
字段?目前,我必须在更新时明确传递date
。以上是关于向已创建的文档添加日期类型的主要内容,如果未能解决你的问题,请参考以下文章