sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $replaceAll

$replaceAll operátor agregačního kanálu byl představen v MongoDB 4.4.

Tento operátor nahradí všechny výskyty 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 $replaceAll 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 $replaceAll operátor, který nahradí první výskyt řetězce Left Handed s jiným řetězcem:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Výsledek:

{
	"_id" : 1,
	"product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case"
}

Všimněte si, že oba výskyty vyhledávacího řetězce (Left Handed ) byly nahrazeny.

Jak název napovídá, $replaceAll nahrazuje vše výskyty hledaného řetězce. Chcete-li nahradit pouze první výskyt, použijte $replaceOne .

Rozlišovat malá a velká písmena

$replaceAll operátor rozlišuje velká a malá písmena.

Příklad:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { 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

$replaceAll 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: { $replaceAll: { 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: { $replaceAll: { 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 $replaceAll jsou null , výsledkem je null .

Zde je příklad poskytnutí null pole operátoru na $replaceAll :

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { 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: { $replaceAll: { 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é $replaceAll 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: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Výsledek:

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

Podle očekávání vrátí chybu.

Normalizace Unicode

$replaceAll operátor neprovádí žádnou normalizaci unicode.

Další informace a příklad naleznete v dokumentaci MongoDB.


  1. Instalace klienta/ovladače PHP 7 MongoDB?

  2. Správa MySQL, MongoDB a PostgreSQL pomocí ChatOps od Slacku

  3. Čtení DBname.system.indexes selhalo na clusteru Atlas pomocí mongobee po připojení

  4. Nahrajte a načtěte soubory pomocí MongoDB a Spring Boot