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.