$replaceOne
aggregeringspipeline-operatør blev introduceret i MongoDB 4.4.
Denne operator erstatter den første forekomst af en søgestreng i en inputstreng med en erstatningsstreng og returnerer resultatet.
Hvis søgestrengen ikke findes, så $replaceOne
returnerer inputstrengen.
Eksempel
Antag, at vi har en samling kaldet products
med følgende dokument:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Lad os bruge $replaceOne
operatør for at erstatte den første forekomst af strengen Left Handed
med en anden streng:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultat:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Bemærk, at der faktisk er to forekomster af søgestrengen (Left Handed
), men kun den første instans blev erstattet.
For at erstatte alle forekomster skal du bruge $replaceAll
operatør.
Skrivar og bogstaver
$replaceOne
operatøren skelner mellem store og små bogstaver.
Eksempel:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultat:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
I dette tilfælde ændrede jeg store og små bogstaver for et enkelt tegn i min søgestreng. Jeg ændrede Handed
til handed
. Dette resulterede i, at søgestrengen ikke blev fundet, så intet blev erstattet. Derfor blev inputstrengen returneret.
Diakritisk følsomhed
$replaceOne
operatoren er diakritisk følsom.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id": 2, "product": "Toupée Tape" }
Og lad os nu prøve at søge og erstatte ordet Toupée
, men glem at bruge den akutte accent:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Resultat:
{ "_id" : 2, "product" : "Toupée Tape" }
Ingen ændring.
Jeg inkluderede ikke diakritikken i min søgestreng, så der var ingen match.
Her er det igen, men denne gang inkluderer jeg diakritikken:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Resultat:
{ "_id" : 2, "product" : "Wig Tape" }
Denne gang blev søgestrengen fundet og erstattet.
Nul-udtryk
Hvis nogen af de udtryk, der er givet til $replaceOne
er null
, resultatet er null
.
Her er et eksempel på at angive en null
operatørfelt til $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
I dette tilfælde find
operatørfeltet var null
og så resultatet blev null
.
Manglende felter
Hvis input
eller find
operatorfelter refererer til et felt, der ikke eksisterer, så resultatet er null
.
Eksempel:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Ikke-strengværdier
Alle udtryk leveret til $replaceOne
skal evalueres til en streng eller null
. Angivelse af en anden type returnerer en fejl.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Lad os prøve at søge og erstatte price
felt:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Resultat:
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
Det returnerer en fejl, som forventet.
Unicode-normalisering
$replaceOne
operatør udfører ikke nogen unicode-normalisering.
Se MongoDB-dokumentationen for mere information om dette og et eksempel.