mongodb - 替换 MongoDB 中所有文档的字段中所有出现的子字符串
问题描述
我有一个集合品牌,我必须将路径 ./assets/ 替换为 D:/data/db/images ,我在多个文档中多次出现这种情况。我如何使用查询来实现这一点?
每份文件的样本
{"name":"Dell","images":["./assets/dell1.jpg","./assets/dell2.jpeg","./assets/dell3.jpg"],
"captions":["Yours is here","Easy as dell","Uniquely you"],
"logo":"./assets/dell4.png",
"details":{"headOffice":"Bangalore","address":"No.12/1, Divyashree Green, Koramangala Inner Ring Rd, Domlur, Bengaluru - 560071",
"phoneNumber":"(080) 28077000 ","website":"www.dell.com"}
}
解决方案
您可以使用聚合框架的$out运算符将聚合的输出重定向到特定集合。如果您指定相同的集合名称,那么它将替换现有集合。
要覆盖现有字段,您可以使用$addFields运算符。然后您只需删除./assets/
使用$substr的长度并使用$concat将其与新前缀连接起来
db.Brands.aggregate([
{
$addFields: {
images: {
$map: {
input: "$images",
as: "image",
in: {
$concat: [ "D:/data/db/images", { $substr: [ "$$image", 8, { $strLenBytes: "$$image" } ] } ]
}
}
}
}
},
{ $out: "Brands" } //replaces existing collection
])
在 MongoDB 3.2 中,您可以运行以下脚本:
db.Brands.find().forEach(function(doc){
doc.images = doc.images.map(function(image){ return image.replace("./assets/","D:/data/db/images/") })
db.Brands.save(doc);
})
推荐阅读
- vba - MS Word 照片标题宏
- hyper-v - 无法使用增强会话连接所有 Win10 Pro x64 VM
- java - 没有输入ExceptionHandler
- nativescript - Nativescript Vue:如何更改帧高度以考虑其他内容的空间?
- c# - 为什么使用DataTrigger更改ItemsSource时,当项目存在于两个源中时,会清除SelectedItem?
- sql - 从表中选择最大记录
- java - 我怎样才能纠正得到 NaN 作为我的结果?
- email - 获取联系人/过去的邮件列表 vbs
- r - r - 使用 kable 对具有相同名称的子列的列进行分组
- regex - 正则表达式 - 匹配除字符以外的任何字符