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.