sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $replaceAll

$replaceAll aggregeringspipeline-operatör introducerades i MongoDB 4.4.

Den här operatorn ersätter alla instanser av en söksträng i en inmatningssträng med en ersättningssträng och returnerar resultatet.

Om söksträngen inte hittas, $replaceAll returnerar inmatningssträngen.

Exempel

Anta att vi har en samling som heter products med följande dokument:

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

Låt oss använda $replaceAll operatorn för att ersätta den första instansen av strängen Left Handed med en annan sträng:

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

Resultat:

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

Lägg märke till att båda instanserna av söksträngen (Left Handed ) ersattes.

Som namnet antyder, $replaceAll ersätter alla förekomster av söksträngen. För att ersätta bara den första förekomst, använd $replaceOne .

Skaftkänslighet

$replaceAll operatören är skiftlägeskänslig.

Exempel:

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 det här fallet ändrade jag skiftläge för ett enskilt tecken i min söksträng. Jag ändrade Handed till handed . Detta resulterade i att söksträngen inte hittades och så ingenting ersattes. Därför returnerades inmatningssträngen.

Diakritisk känslighet

$replaceAll operatorn är diakritisk känslig.

Anta att vi lägger till följande dokument i vår samling:

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

Och låt oss nu försöka söka och ersätta ordet Toupée , men glöm att använda den akuta accenten:

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

Resultat:

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

Ingen förändring.

Jag inkluderade inte diakritiken i min söksträng och så det fanns ingen matchning.

Här är den igen, men den här gången inkluderar jag diakritiken:

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

Resultat:

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

Den här gången hittades och ersattes söksträngen.

Nulluttryck

Om något av uttrycken som tillhandahålls till $replaceAll är null , resultatet är null .

Här är ett exempel på att tillhandahålla en null operatorfält till $replaceAll :

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

Resultat:

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

I det här fallet find operatorfältet var null och så resultatet blev null .

Fält saknas

Om input eller find operatorfält hänvisar till ett fält som inte finns, då blir resultatet null .

Exempel:

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

Resultat:

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

Icke-strängvärden

Alla uttryck som tillhandahålls till $replaceAll måste utvärderas till en sträng eller null . Om du anger någon annan typ returneras ett fel.

Anta att vi lägger till följande dokument i vår samling:

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

Låt oss försöka göra en sökning och ersätta price fält:

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 returnerar ett fel, som förväntat.

Unicode-normalisering

$replaceAll operatören utför ingen unicode-normalisering.

Se MongoDB-dokumentationen för mer information om detta och ett exempel.


  1. Planera och hantera scheman i MongoDB (även om det är schemalöst)

  2. Hur upprätthåller man främmande nycklar i NoSql-databaser (MongoDB)?

  3. Hur man ansluter mongodb-klienter till lokala Meteor MongoDB

  4. Hur loggar man frågorna som körs av Spring Data MongoDB?