mongodb - 在mongodb的字符串数组中查找和替换
问题描述
我正在使用 MongoDB v4.4。我的文档结构如下所示:
{
_id: ObjectId("..."),
photos: ["image1.png", "image2.png"]
},
{
_id: ObjectId("..."),
photos: ["image3.png", "another_image.png, image5.jpg"]
},
{
_id: ObjectId("..."),
photos: ["image_name.jpg", "image2.jpg"]
},
我正在尝试将所有包含“.png”的字符串更改为“.jpg”。
我尝试了以下方法:
db.users.updateMany({
photos: { $regex: /.png/ }
}, [{
$set: {
"photos.$[]": {
$replaceOne: {
input: "photos.$[]", find: ".png", replacement: ".jpg"
}
}
}
}])
这将返回错误:
MongoServerError: Invalid $set :: caused by :: FieldPath field names may not start with '$'.
解决方案
您需要迭代photos
数组循环并替换扩展名,
$map
photos
迭代数组的循环$replaceOne
替换扩展名
db.users.updateMany(
{ photos: { $regex: ".png" } },
[{
$set: {
photos: {
$map: {
input: "$photos",
in: {
$replaceOne: {
input: "$$this",
find: ".png",
replacement: ".jpg"
}
}
}
}
}
}]
)
推荐阅读
- solr - 当所有查询词都出现在 solr 搜索字段中时,提升短语匹配
- mysql - MySQL - 如何将等式中的默认值设置为 0?
- regex - 如果条件无效,则不匹配组
- vbscript - 如果 IP 被禁用,win32_networkadapterconfiguration 类不会返回完整的网络适配器名称
- .net-core - 如何获得准确的 F# 版本号(例如:4.7.2,而不仅仅是 4.7)
- python - ReplaceOne 如果查询匹配,InsertOne 如果文档不存在
- sql - 对于语句,显示所有违反约束的行
- java - 如何在不将所有数据混合到一行的情况下将数组保存到字符串中?
- angular - fixture.destroy() 是否应该在 Angular 2+ 单元测试中显式
- python - Bash:/usr/bin/pip:权限被拒绝