De $replaceOne
aggregatiepijplijnoperator werd geïntroduceerd in MongoDB 4.4.
Deze operator vervangt de eerste instantie van een zoekstring in een invoerstring door een vervangende string en retourneert het resultaat.
Als de zoekreeks niet wordt gevonden, dan $replaceOne
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 $replaceOne
. gebruiken operator om de eerste instantie van de tekenreeks Left Handed
te vervangen met een andere string:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultaat:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Merk op dat er in feite twee exemplaren van de zoekreeks zijn (Left Handed
) maar alleen het eerste exemplaar werd vervangen.
Gebruik de $replaceAll
. om alle instanties te vervangen telefoniste.
Hoofdlettergevoeligheid
De $replaceOne
operator is hoofdlettergevoelig.
Voorbeeld:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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 $replaceOne
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: { $replaceOne: { 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: { $replaceOne: { 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 die zijn verstrekt aan $replaceOne
zijn null
, het resultaat is null
.
Hier is een voorbeeld van het verstrekken van een null
operatorveld naar $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultaat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Niet-tekenreekswaarden
Alle uitdrukkingen geleverd aan $replaceOne
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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Resultaat:
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
Het retourneert een fout, zoals verwacht.
Unicode-normalisatie
De $replaceOne
operator voert geen Unicode-normalisatie uit.
Zie de MongoDB-documentatie voor meer informatie hierover en een voorbeeld.