Вы можете попробовать выполнить конвейер агрегации в версии 3.4
.
Запрос агрегирования для замены строки поиска на заменяющую строку.
Логика заключается в поиске строки поиска ( $indexOfCP
), а затем $concat
, чтобы присоединиться ко всем частям ($substrCP
), части перед соответствующей строкой поиска, заменой строки и остальной части исходной строки.
Массовое обновление для записи нового структура url.
var bulk = db.getCollection(col).initializeUnorderedBulkOp();
var count = 0;
var batch = 1;
db.getCollection(col).aggregate([
{"$project":{
"URL":{
"$let":{
"vars":{
"len":{
"$strLenCP":"helloWorldt"},"start":{"$indexOfCP":["$URL","helloWorldt"]}
},
"in":{
"$concat":[
{"$substrCP":["$URL",0,"$$start"]},
"helloWorld",
{"$substrCP":[
"$URL",
{"$add":["$$start","$$len"]},
{"$subtract":[{"$strLenCP":"$URL"},{"$add":["$$start","$$len"]}]}
]}
]
}
}
}
}}
]).forEach(function(doc){
var _id = doc._id;
var url = doc.URL;
bulk.find({ "_id" : _id }).updateOne(
{ $set: {"URL" : url } }
);
count++;
if (count == batch) {
bulk.execute();
bulk = db.getCollection(col).initializeUnorderedBulkOp();
count = 0;
}
});
if (count > 0) {
bulk.execute();
}