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

MongoDB $replaceOne

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

Cet opérateur remplace la première instance 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 $replaceOne 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 $replaceOne opérateur pour remplacer la première instance de la chaîne Left Handed avec une autre chaîne :

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

Résultat :

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

Notez qu'il existe en fait deux instances de la chaîne de recherche (Left Handed ) mais seule la première instance a été remplacée.

Pour remplacer toutes les instances, utilisez le $replaceAll opérateur.

Sensibilité à la casse

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

Exemple :

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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 $replaceOne 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: { $replaceOne: { 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: { $replaceOne: { 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 à $replaceOne sont null , le résultat est null .

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

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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: { $replaceOne: { 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 à $replaceOne 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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Résultat :

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

Il renvoie une erreur, comme prévu.

Normalisation Unicode

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

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