MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $replaceAll

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.