$replaceAll aggregeringspipeline-operatør blev introduceret i MongoDB 4.4.
Denne operator erstatter alle forekomster af en søgestreng i en inputstreng med en erstatningsstreng og returnerer resultatet.
Hvis søgestrengen ikke findes, så $replaceAll returnerer inputstrengen.
Eksempel
Antag, at vi har en samling kaldet products med følgende dokument:
{
"_id" : 1,
"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}
Lad os bruge $replaceAll operatør for at erstatte den første forekomst af strengen Left Handed med en anden streng:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Resultat:
{
"_id" : 1,
"product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case"
}
Bemærk, at begge forekomster af søgestrengen (Left Handed ) blev erstattet.
Som navnet antyder, $replaceAll erstatter alle forekomster af søgestrengen. For kun at erstatte den første forekomst, brug $replaceOne .
Skrivar og bogstaver
$replaceAll operatøren skelner mellem store og små bogstaver.
Eksempel:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Resultat:
{
"_id" : 1,
"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}
I dette tilfælde ændrede jeg store og små bogstaver for et enkelt tegn i min søgestreng. Jeg ændrede Handed til handed . Dette resulterede i, at søgestrengen ikke blev fundet, så intet blev erstattet. Derfor blev inputstrengen returneret.
Diakritisk følsomhed
$replaceAll operatoren er diakritisk følsom.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id": 2, "product": "Toupée Tape" }
Og lad os nu prøve at søge og erstatte ordet Toupée , men glem at bruge den akutte accent:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
]) Resultat:
{ "_id" : 2, "product" : "Toupée Tape" } Ingen ændring.
Jeg inkluderede ikke diakritikken i min søgestreng, så der var ingen match.
Her er det igen, men denne gang inkluderer jeg diakritikken:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
]) Resultat:
{ "_id" : 2, "product" : "Wig Tape" } Denne gang blev søgestrengen fundet og erstattet.
Nul-udtryk
Hvis nogen af de udtryk, der er givet til $replaceAll er null , resultatet er null .
Her er et eksempel på at angive en null operatørfelt til $replaceAll :
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty() Resultat:
{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }
I dette tilfælde find operatørfeltet var null og så resultatet blev null .
Manglende felter
Hvis input eller find operatorfelter refererer til et felt, der ikke eksisterer, så resultatet er null .
Eksempel:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Resultat:
{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null } Ikke-strengværdier
Alle udtryk leveret til $replaceAll skal evalueres til en streng eller null . Angivelse af en anden type returnerer en fejl.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Lad os prøve at søge og erstatte price felt:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
]) Resultat:
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 Det returnerer en fejl, som forventet.
Unicode-normalisering
$replaceAll operatør udfører ikke nogen unicode-normalisering.
Se MongoDB-dokumentationen for mere information om dette og et eksempel.