$replaceAll операторът на конвейер за агрегиране беше въведен в MongoDB 4.4.
Този оператор замества всички екземпляри на низ за търсене във входен низ със заместващ низ и връща резултата.
Ако низът за търсене не бъде намерен, тогава $replaceAll връща входния низ.
Пример
Да предположим, че имаме колекция, наречена products със следния документ:
{
"_id" : 1,
"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}
Нека използваме $replaceAll оператор за замяна на първия екземпляр на низа Left Handed с друг низ:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Резултат:
{
"_id" : 1,
"product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case"
}
Обърнете внимание, че и двата екземпляра на низа за търсене (Left Handed ) бяха заменени.
Както подсказва името, $replaceAll замества всички поява на търсещия низ. За замяна само на първия възникване, използвайте $replaceOne .
Чувствителност на регистрите
$replaceAll Операторът е чувствителен към малките букви.
Пример:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Резултат:
{
"_id" : 1,
"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}
В този случай промених регистъра на буквите на един знак в моя низ за търсене. Промених Handed на handed . Това доведе до това, че низът за търсене не беше намерен и така нищо не беше заменено. Следователно входният низ беше върнат.
Диакритична чувствителност
$replaceAll Операторът е чувствителен към диакритика.
Да предположим, че добавяме следния документ към нашата колекция:
{ "_id": 2, "product": "Toupée Tape" }
А сега нека се опитаме да потърсим и заменим думата Toupée , но забравете да използвате острото ударение:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
]) Резултат:
{ "_id" : 2, "product" : "Toupée Tape" } Няма промяна.
Не включих диакритиката в моя низ за търсене и така нямаше съвпадение.
Ето го отново, но този път включвам диакритиката:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
]) Резултат:
{ "_id" : 2, "product" : "Wig Tape" } Този път низът за търсене беше намерен и заменен.
Нулеви изрази
Ако някой от изразите, предоставени на $replaceAll са null , резултатът е null .
Ето пример за предоставяне на null операторно поле до $replaceAll :
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty() Резултат:
{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }
В този случай find полето на оператора беше null и така резултатът беше null .
Липсващи полета
Ако input или find полетата на оператора се отнасят до поле, което не съществува, тогава резултатът е null .
Пример:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Резултат:
{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null } Ненизови стойности
Всички изрази, предоставени на $replaceAll трябва да се оценява като низ или null . Предоставянето на друг тип връща грешка.
Да предположим, че добавяме следния документ към нашата колекция:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Нека се опитаме да направим търсене и замяна на price поле:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
]) Резултат:
Error: command failed: {
"ok" : 0,
"errmsg" : "$replaceAll requires that 'input' be a string, found: 7.50",
"code" : 51746,
"codeName" : "Location51746"
} : aggregate failed :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/mongo/shell/collection.js:1046:12
@(shell):1:1 Връща грешка, както се очаква.
Нормализация на Unicode
$replaceAll операторът не извършва нормализиране на Unicode.
Вижте документацията на MongoDB за повече информация и пример.