MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $replaceAll

Le $replaceAll l'opérateur de pipeline d'agrégation a été introduit dans MongoDB 4.4.

Cet opérateur remplace toutes les instances d'une chaîne de recherche dans une chaîne d'entrée par une chaîne de remplacement et renvoie le résultat.

Si la chaîne de recherche n'est pas trouvée, alors $replaceAll renvoie la chaîne d'entrée.

Exemple

Supposons que nous ayons une collection appelée products avec le document suivant :

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

Utilisons le $replaceAll opérateur pour remplacer la première instance de la chaîne Left Handed avec une autre chaîne :

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

Résultat :

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

Notez que les deux instances de la chaîne de recherche (Left Handed ) ont été remplacés.

Comme son nom l'indique, $replaceAll remplace tous occurrences de la chaîne de recherche. Pour remplacer uniquement le premier occurrence, utilisez $replaceOne .

Sensibilité à la casse

Le $replaceAll l'opérateur est sensible à la casse.

Exemple :

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

Résultat :

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

Dans ce cas, j'ai changé la casse d'un seul caractère dans ma chaîne de recherche. J'ai changé Handed à handed . Cela a eu pour résultat que la chaîne de recherche n'a pas été trouvée et donc rien n'a été remplacé. Par conséquent, la chaîne d'entrée a été renvoyée.

Sensibilité diacritique

Le $replaceAll l'opérateur est sensible aux signes diacritiques.

Supposons que nous ajoutions le document suivant à notre collection :

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

Et maintenant essayons de rechercher et de remplacer le mot Toupée , mais oubliez d'utiliser l'accent aigu :

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

Résultat :

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

Pas de changement.

Je n'ai pas inclus le signe diacritique dans ma chaîne de recherche et il n'y avait donc pas de correspondance.

Le voici à nouveau, mais cette fois j'inclus le signe diacritique :

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

Résultat :

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

Cette fois, la chaîne de recherche a été trouvée et remplacée.

Expressions nulles

Si l'une des expressions fournies à $replaceAll sont null , le résultat est null .

Voici un exemple de fourniture d'un null champ opérateur à $replaceAll :

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

Résultat :

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

Dans ce cas, le find le champ de l'opérateur était null et donc le résultat était null .

Champs manquants

Si l'input ou find les champs d'opérateur font référence à un champ qui n'existe pas, alors le résultat est null .

Exemple :

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

Résultat :

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

Valeurs non chaîne

Toutes les expressions fournies à $replaceAll doit correspondre à une chaîne ou null . La fourniture de tout autre type renvoie une erreur.

Supposons que nous ajoutions le document suivant à notre collection :

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

Essayons de faire une recherche et remplacement sur le price champ :

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

Résultat :

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

Il renvoie une erreur, comme prévu.

Normalisation Unicode

Le $replaceAll l'opérateur n'effectue aucune normalisation unicode.

Consultez la documentation de MongoDB pour plus d'informations à ce sujet et un exemple.