$replaceAll
operátor agregačního kanálu byl představen v MongoDB 4.4.
Tento operátor nahradí všechny výskyty hledaného řetězce ve vstupním řetězci náhradním řetězcem a vrátí výsledek.
Pokud hledaný řetězec není nalezen, pak $replaceAll
vrátí vstupní řetězec.
Příklad
Předpokládejme, že máme kolekci nazvanou products
s následujícím dokumentem:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Použijme $replaceAll
operátor, který nahradí první výskyt řetězce Left Handed
s jiným řetězcem:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Výsledek:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case" }
Všimněte si, že oba výskyty vyhledávacího řetězce (Left Handed
) byly nahrazeny.
Jak název napovídá, $replaceAll
nahrazuje vše výskyty hledaného řetězce. Chcete-li nahradit pouze první výskyt, použijte $replaceOne
.
Rozlišovat malá a velká písmena
$replaceAll
operátor rozlišuje velká a malá písmena.
Příklad:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Výsledek:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
V tomto případě jsem změnil velikost písmen jednoho znaku v mém vyhledávacím řetězci. Změnil jsem Handed
handed
. To vedlo k tomu, že hledaný řetězec nebyl nalezen, a tak nebylo nic nahrazeno. Proto byl vrácen vstupní řetězec.
Diakritická citlivost
$replaceAll
operátor je citlivý na diakritiku.
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id": 2, "product": "Toupée Tape" }
A teď zkusme vyhledat a nahradit slovo Toupée
, ale zapomeňte použít akutní přízvuk:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Výsledek:
{ "_id" : 2, "product" : "Toupée Tape" }
Žádná změna.
Do vyhledávacího řetězce jsem nezahrnul diakritiku, takže jsem nenašel žádnou shodu.
Tady je to znovu, ale tentokrát jsem přidal diakritiku:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Výsledek:
{ "_id" : 2, "product" : "Wig Tape" }
Tentokrát byl hledaný řetězec nalezen a nahrazen.
Nulové výrazy
Pokud některý z výrazů poskytnutých $replaceAll
jsou null
, výsledkem je null
.
Zde je příklad poskytnutí null
pole operátoru na $replaceAll
:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Výsledek:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
V tomto případě find
pole operátoru bylo null
takže výsledek byl null
.
Chybějící pole
Pokud input
nebo find
pole operátorů odkazují na pole, které neexistuje, pak je výsledkem null
.
Příklad:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Výsledek:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Neřetězcové hodnoty
Všechny výrazy poskytnuté $replaceAll
musí být vyhodnocen jako řetězec nebo null
. Zadání jakéhokoli jiného typu vrátí chybu.
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Zkusme vyhledat a nahradit price
pole:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Výsledek:
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
Podle očekávání vrátí chybu.
Normalizace Unicode
$replaceAll
operátor neprovádí žádnou normalizaci unicode.
Další informace a příklad naleznete v dokumentaci MongoDB.