Der $replaceOne
Der Aggregation-Pipeline-Operator wurde in MongoDB 4.4 eingeführt.
Dieser Operator ersetzt das erste Vorkommen einer Suchzeichenfolge in einer Eingabezeichenfolge durch eine Ersatzzeichenfolge und gibt das Ergebnis zurück.
Wenn die Suchzeichenfolge nicht gefunden wird, dann $replaceOne
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 $replaceOne
verwenden -Operator zum Ersetzen der ersten Instanz der Zeichenfolge Left Handed
mit einem anderen String:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Beachten Sie, dass es tatsächlich zwei Instanzen der Suchzeichenfolge gibt (Left Handed
), aber nur die erste Instanz wurde ersetzt.
Um alle Instanzen zu ersetzen, verwenden Sie $replaceAll
Betreiber.
Groß-/Kleinschreibung
Der $replaceOne
Bei dem Operator wird zwischen Groß- und Kleinschreibung unterschieden.
Beispiel:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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
Der $replaceOne
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: { $replaceOne: { 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: { $replaceOne: { 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 $replaceOne
bereitgestellt wird sind null
, ist das Ergebnis null
.
Hier ist ein Beispiel für die Bereitstellung eines null
Operatorfeld zu $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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 Feld, das nicht existiert, dann ist das Ergebnis null
.
Beispiel:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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 $replaceOne
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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Ergebnis:
Error: command failed: { "ok" : 0, "errmsg" : "$replaceOne 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
Der $replaceOne
Operator führt keine Unicode-Normalisierung durch.
Weitere Informationen dazu und ein Beispiel finden Sie in der MongoDB-Dokumentation.