De $replaceAll
aggregatiepijplijnoperator werd geïntroduceerd in MongoDB 4.4.
Deze operator vervangt alle instanties van een zoekstring in een invoerstring door een vervangende string en geeft het resultaat terug.
Als de zoekreeks niet wordt gevonden, dan $replaceAll
geeft de invoerreeks terug.
Voorbeeld
Stel dat we een verzameling hebben met de naam products
met het volgende document:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Laten we de $replaceAll
. gebruiken operator om de eerste instantie van de tekenreeks Left Handed
te vervangen met een andere string:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultaat:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case" }
Merk op dat beide instanties van de zoekreeks (Left Handed
) zijn vervangen.
Zoals de naam al doet vermoeden, $replaceAll
vervangt alle voorkomens van de zoekreeks. Om alleen de eerste te vervangen voorval, gebruik $replaceOne
.
Hoofdlettergevoeligheid
De $replaceAll
operator is hoofdlettergevoelig.
Voorbeeld:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultaat:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
In dit geval heb ik het geval van een enkel teken in mijn zoekreeks gewijzigd. Ik heb Handed
gewijzigd aan handed
. Hierdoor werd de zoekstring niet gevonden en werd er dus niets vervangen. Daarom is de invoerreeks geretourneerd.
Diakritische gevoeligheid
De $replaceAll
operator is gevoelig voor diakritische tekens.
Stel dat we het volgende document aan onze collectie toevoegen:
{ "_id": 2, "product": "Toupée Tape" }
En laten we nu proberen het woord Toupée
te zoeken en te vervangen , maar vergeet het acute accent te gebruiken:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Resultaat:
{ "_id" : 2, "product" : "Toupée Tape" }
Geen verandering.
Ik heb het diakritische teken niet in mijn zoekreeks opgenomen en er was dus geen overeenkomst.
Hier is het weer, maar deze keer voeg ik het diakritische teken toe:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Resultaat:
{ "_id" : 2, "product" : "Wig Tape" }
Deze keer is de zoekreeks gevonden en vervangen.
Null-expressies
Als een van de uitdrukkingen aan $replaceAll
zijn null
, het resultaat is null
.
Hier is een voorbeeld van het verstrekken van een null
operatorveld naar $replaceAll
:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultaat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
In dit geval de find
operatorveld was null
en dus was het resultaat null
.
Ontbrekende velden
Als de input
of find
operatorvelden verwijzen naar een veld dat niet bestaat, dan is het resultaat null
.
Voorbeeld:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultaat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Niet-tekenreekswaarden
Alle uitdrukkingen geleverd aan $replaceAll
moet evalueren naar een string of null
. Als u een ander type geeft, wordt een fout geretourneerd.
Stel dat we het volgende document aan onze collectie toevoegen:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Laten we proberen te zoeken en te vervangen op de price
veld:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Resultaat:
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
Het geeft een fout terug, zoals verwacht.
Unicode-normalisatie
De $replaceAll
operator voert geen Unicode-normalisatie uit.
Zie de MongoDB-documentatie voor meer informatie hierover en een voorbeeld.