sql >> Database >  >> NoSQL >> MongoDB

MongoDB $replaceOne

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

Deze operator vervangt de eerste instantie van een zoekstring in een invoerstring door een vervangende string en retourneert het resultaat.

Als de zoekreeks niet wordt gevonden, dan $replaceOne 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 $replaceOne . gebruiken operator om de eerste instantie van de tekenreeks Left Handed te vervangen met een andere string:

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

Resultaat:

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

Merk op dat er in feite twee exemplaren van de zoekreeks zijn (Left Handed ) maar alleen het eerste exemplaar werd vervangen.

Gebruik de $replaceAll . om alle instanties te vervangen telefoniste.

Hoofdlettergevoeligheid

De $replaceOne operator is hoofdlettergevoelig.

Voorbeeld:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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 $replaceOne 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: { $replaceOne: { 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: { $replaceOne: { 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 die zijn verstrekt aan $replaceOne zijn null , het resultaat is null .

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

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultaat:

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

Niet-tekenreekswaarden

Alle uitdrukkingen geleverd aan $replaceOne 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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Resultaat:

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

Het retourneert een fout, zoals verwacht.

Unicode-normalisatie

De $replaceOne operator voert geen Unicode-normalisatie uit.

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


  1. MongoDB $verdelen

  2. Snelste manier om dubbele documenten in mongodb te verwijderen

  3. Mongo-volgorde op lengte van array

  4. Langlopende bewerkingen beheren in MongoDB