Die $replaceAll
Der Aggregation-Pipeline-Operator wurde in MongoDB 4.4 eingeführt.
Dieser Operator ersetzt alle Instanzen einer Suchzeichenfolge in einer Eingabezeichenfolge durch eine Ersatzzeichenfolge und gibt das Ergebnis zurück.
Wenn die Suchzeichenfolge nicht gefunden wird, dann $replaceAll
gibt die Eingabezeichenfolge zurück.
Beispiel
Angenommen, wir haben eine Sammlung namens products
mit folgendem Dokument:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Lassen Sie uns den $replaceAll
verwenden -Operator zum Ersetzen der ersten Instanz der Zeichenfolge Left Handed
mit einem anderen String:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case" }
Beachten Sie, dass beide Instanzen der Suchzeichenfolge (Left Handed
) wurden ersetzt.
Wie der Name schon sagt, $replaceAll
ersetzt alle Vorkommen der Suchzeichenfolge. Um nur das erste zu ersetzen verwenden Sie $replaceOne
.
Groß-/Kleinschreibung
Die $replaceAll
Bei dem Operator wird zwischen Groß- und Kleinschreibung unterschieden.
Beispiel:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
In diesem Fall habe ich die Groß-/Kleinschreibung eines einzelnen Zeichens in meiner Suchzeichenfolge geändert. Ich habe Handed
geändert zu handed
. Dies führte dazu, dass die Suchzeichenfolge nicht gefunden wurde und daher nichts ersetzt wurde. Daher wurde die Eingabezeichenfolge zurückgegeben.
Diakritische Empfindlichkeit
Die $replaceAll
Operator ist diakritisch sensitiv.
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id": 2, "product": "Toupée Tape" }
Und jetzt versuchen wir, das Wort Toupée
zu suchen und zu ersetzen , aber vergessen Sie den Akut-Akzent:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Ergebnis:
{ "_id" : 2, "product" : "Toupée Tape" }
Keine Änderung.
Ich habe das diakritische Zeichen nicht in meine Suchzeichenfolge eingefügt, daher gab es keine Übereinstimmung.
Hier ist es noch einmal, aber dieses Mal füge ich das diakritische Zeichen hinzu:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Ergebnis:
{ "_id" : 2, "product" : "Wig Tape" }
Diesmal wurde der Suchstring gefunden und ersetzt.
Nullausdrücke
Wenn einer der Ausdrücke für $replaceAll
bereitgestellt wird sind null
, ist das Ergebnis null
.
Hier ist ein Beispiel für die Bereitstellung eines null
Operatorfeld zu $replaceAll
:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
In diesem Fall find
Operatorfeld war null
und so war das Ergebnis null
.
Fehlende Felder
Wenn die input
oder find
Operatorfelder verweisen auf ein nicht vorhandenes Feld, dann ist das Ergebnis null
.
Beispiel:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Nicht-String-Werte
Alle Ausdrücke, die für $replaceAll
bereitgestellt werden muss als String oder null
ausgewertet werden . Die Angabe eines anderen Typs gibt einen Fehler zurück.
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Lassen Sie uns versuchen, nach price
zu suchen und zu ersetzen Feld:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Ergebnis:
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
Wie erwartet wird ein Fehler zurückgegeben.
Unicode-Normalisierung
Die $replaceAll
Operator führt keine Unicode-Normalisierung durch.
Weitere Informationen dazu und ein Beispiel finden Sie in der MongoDB-Dokumentation.