替换MongoDB中所有文档中字段中所有出现的子字符串

时间:2018-09-27 06:25:28

标签: mongodb mongodb-query

我有一个Brands集合,我必须将路径./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"}
             }

1 个答案:

答案 0 :(得分:1)

您可以使用Aggregation Framework的$out运算符将您的聚合输出重定向到特定集合。如果您指定相同的集合名称,则它将替换现有的集合。

要覆盖现有字段,可以使用$addFields运算符。然后,您只需使用$substr删除./assets/的长度,并使用$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);    
})