首页 > 解决方案 > 替换 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"}
             }

标签: mongodbmongodb-query

解决方案


您可以使用聚合框架的$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);    
})

推荐阅读