mongodb - 如何更新多个文档并在 MongoDB 中添加从另一个计算的新字段?
问题描述
我有多个文档,text
其中包含日期/时间字符串(例如'2020-12-14 22:43:56')或一些文本的字段。我想在所有文档中添加一个新字段,该字段将从中计算text
并包含 ISODate 或 null。我有这个脚本应该这样做,它可以在投影中工作,但不适用于更新操作:
db.test.updateMany(
{date: {$exists: false}},
{$set: {
date: {$dateFromString: {
dateString: "$text",
format: "%Y-%m-%d %H:%M:%S",
onError: null
}}
}
})
但它会抛出一个错误:
WriteError({
"index" : 0,
"code" : 52,
"errmsg" : "The dollar ($) prefixed field '$dateFromString' in 'date.$dateFromString' is not valid for storage.",
"op" : {
"q" : {
"date" : {
"$exists" : false
}
},
"u" : {
"$set" : {
"date" : {
"$dateFromString" : {
"dateString" : "$text",
"format" : "%Y-%m-%d %H:%M:%S",
"onError" : null
}
}
}
},
"multi" : true,
"upsert" : false
}
})
我做错了什么?这样做的正确方法是什么?
解决方案
$dateFromString
是一个聚合函数,不能直接在updateMany
. 幸运的是(从 MongoDB 4.2 开始)updateMany
也接受一个聚合管道,而不仅仅是一个更新文档。
会是这个:
db.test.updateMany(
{date: {$exists: false}},
[
{$addFields: {
date: {$dateFromString: {
dateString: "$text",
format: "%Y-%m-%d %H:%M:%S",
onError: null
}}
}
}
]
)
$addFields
只是一个别名$set
- 但它可视化更新运算符$set和聚合阶段$set之间的区别
请参阅使用聚合管道进行更新
推荐阅读
- python - 如何在python中混合普通参数和切片参数
- android - 为数据绑定创建自定义绑定适配器
- c# - 连接到 MQ 时出现 2035 和 2059 错误
- kubernetes - 名称在 Kubernetes 中无法使用 docker 解析
- arrays - VBA-将值范围放入数组
- html - 在服务器上使用 wget 下载大文件
- java - 将 Selenium 浏览器脚本转换为 Jmeter 脚本的简单方法?
- angular - 角度替换方法不适用于字符串
- c# - Notepad .LOG 仅在手动打开时节省日志时间
- excel - 如何在具有多个条件的excel中运行条件关联?