Заменить все вхождения подстроки в поле во всех документах в MongoDB - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть коллекция брендов, я должен заменить путь ./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 голосов
/ 27 сентября 2018

Вы можете использовать оператор Aggregation Framework $ 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);    
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...