sql >> Database >  >> NoSQL >> MongoDB

MongoDB $replaceAll

De $replaceAll aggregatiepijplijnoperator werd geïntroduceerd in MongoDB 4.4.

Deze operator vervangt alle instanties van een zoekstring in een invoerstring door een vervangende string en geeft het resultaat terug.

Als de zoekreeks niet wordt gevonden, dan $replaceAll geeft de invoerreeks terug.

Voorbeeld

Stel dat we een verzameling hebben met de naam products met het volgende document:

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

Laten we de $replaceAll . gebruiken operator om de eerste instantie van de tekenreeks Left Handed te vervangen met een andere string:

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

Resultaat:

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

Merk op dat beide instanties van de zoekreeks (Left Handed ) zijn vervangen.

Zoals de naam al doet vermoeden, $replaceAll vervangt alle voorkomens van de zoekreeks. Om alleen de eerste te vervangen voorval, gebruik $replaceOne .

Hoofdlettergevoeligheid

De $replaceAll operator is hoofdlettergevoelig.

Voorbeeld:

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

Resultaat:

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

In dit geval heb ik het geval van een enkel teken in mijn zoekreeks gewijzigd. Ik heb Handed gewijzigd aan handed . Hierdoor werd de zoekstring niet gevonden en werd er dus niets vervangen. Daarom is de invoerreeks geretourneerd.

Diakritische gevoeligheid

De $replaceAll operator is gevoelig voor diakritische tekens.

Stel dat we het volgende document aan onze collectie toevoegen:

{ "_id": 2, "product": "Toupée Tape" }

En laten we nu proberen het woord Toupée te zoeken en te vervangen , maar vergeet het acute accent te gebruiken:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
      }
   }
])

Resultaat:

{ "_id" : 2, "product" : "Toupée Tape" }

Geen verandering.

Ik heb het diakritische teken niet in mijn zoekreeks opgenomen en er was dus geen overeenkomst.

Hier is het weer, maar deze keer voeg ik het diakritische teken toe:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
      }
   }
])

Resultaat:

{ "_id" : 2, "product" : "Wig Tape" }

Deze keer is de zoekreeks gevonden en vervangen.

Null-expressies

Als een van de uitdrukkingen aan $replaceAll zijn null , het resultaat is null .

Hier is een voorbeeld van het verstrekken van een null operatorveld naar $replaceAll :

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

Resultaat:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

In dit geval de find operatorveld was null en dus was het resultaat null .

Ontbrekende velden

Als de input of find operatorvelden verwijzen naar een veld dat niet bestaat, dan is het resultaat null .

Voorbeeld:

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

Resultaat:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

Niet-tekenreekswaarden

Alle uitdrukkingen geleverd aan $replaceAll moet evalueren naar een string of null . Als u een ander type geeft, wordt een fout geretourneerd.

Stel dat we het volgende document aan onze collectie toevoegen:

{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }

Laten we proberen te zoeken en te vervangen op de price veld:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Resultaat:

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

Het geeft een fout terug, zoals verwacht.

Unicode-normalisatie

De $replaceAll operator voert geen Unicode-normalisatie uit.

Zie de MongoDB-documentatie voor meer informatie hierover en een voorbeeld.


  1. MongoDB en sluit zich aan

  2. Bestand doorgeven aan actieve taak / achtergrondtaak

  3. MongoDB-queryresultaten exporteren naar een CSV-bestand

  4. Zoek een document met ObjectID in mongoDB