$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 : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Връща грешка, както се очаква.
Нормализация на Unicode
$replaceAll
операторът не извършва нормализиране на Unicode.
Вижте документацията на MongoDB за повече информация и пример.