sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $erstatAlle

$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 :
[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

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.


  1. Hurtig måde at finde dubletter på indekseret kolonne i mongodb

  2. Hvordan sender socket.io beskeder på tværs af flere servere?

  3. Kan ikke scanne med redis skabelon

  4. StackExchange.Redis hvordan man abonnerer på flere kanaler