$replaceOne operátor agregačního kanálu byl představen v MongoDB 4.4.
Tento operátor nahradí první výskyt 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 $replaceOne 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 $replaceOne operátor, který nahradí první výskyt řetězce Left Handed s jiným řetězcem:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Výsledek:
{
"_id" : 1,
"product" : "Ambidextrous Screwdriver with Left Handed Carry Case"
}
Všimněte si, že ve skutečnosti existují dva výskyty hledaného řetězce (Left Handed ), ale nahrazena byla pouze první instance.
Chcete-li nahradit všechny instance, použijte $replaceAll operátor.
Rozlišovat malá a velká písmena
$replaceOne operátor rozlišuje velká a malá písmena.
Příklad:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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
$replaceOne 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: { $replaceOne: { 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: { $replaceOne: { 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 $replaceOne jsou null , výsledkem je null .
Zde je příklad poskytnutí null pole operátoru na $replaceOne :
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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: { $replaceOne: { 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é $replaceOne 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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
]) Výsledek:
Error: command failed: {
"ok" : 0,
"errmsg" : "$replaceOne 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 Podle očekávání vrátí chybu.
Normalizace Unicode
$replaceOne operátor neprovádí žádnou normalizaci unicode.
Další informace a příklad naleznete v dokumentaci MongoDB.