$replaceOne
aggregeringspipeline-operatör introducerades i MongoDB 4.4.
Den här operatorn ersätter den första instansen av en söksträng i en inmatningssträng med en ersättningssträng och returnerar resultatet.
Om söksträngen inte hittas, $replaceOne
returnerar inmatningssträngen.
Exempel
Anta att vi har en samling som heter products
med följande dokument:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Låt oss använda $replaceOne
operatorn för att ersätta den första instansen av strängen Left Handed
med en annan sträng:
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" }
Lägg märke till att det faktiskt finns två instanser av söksträngen (Left Handed
) men bara den första instansen ersattes.
För att ersätta alla instanser, använd $replaceAll
operatör.
Skaftkänslighet
$replaceOne
operatören är skiftlägeskänslig.
Exempel:
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 det här fallet ändrade jag skiftläge för ett enskilt tecken i min söksträng. Jag ändrade Handed
till handed
. Detta resulterade i att söksträngen inte hittades och så ingenting ersattes. Därför returnerades inmatningssträngen.
Diakritisk känslighet
$replaceOne
operatorn är diakritisk känslig.
Anta att vi lägger till följande dokument i vår samling:
{ "_id": 2, "product": "Toupée Tape" }
Och låt oss nu försöka söka och ersätta ordet Toupée
, men glöm att använda den akuta accenten:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Resultat:
{ "_id" : 2, "product" : "Toupée Tape" }
Ingen förändring.
Jag inkluderade inte diakritiken i min söksträng och så det fanns ingen matchning.
Här är den igen, men den här gången inkluderar jag diakritiken:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Resultat:
{ "_id" : 2, "product" : "Wig Tape" }
Den här gången hittades och ersattes söksträngen.
Nulluttryck
Om något av uttrycken tillhandahålls till $replaceOne
är null
, resultatet är null
.
Här är ett exempel på att tillhandahålla en null
operatorfält till $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
I det här fallet find
operatorfältet var null
och så resultatet blev null
.
Fält saknas
Om input
eller find
operatorfält hänvisar till ett fält som inte finns, då blir resultatet null
.
Exempel:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultat:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Icke-strängvärden
Alla uttryck som tillhandahålls till $replaceOne
måste utvärderas till en sträng eller null
. Om du anger någon annan typ returneras ett fel.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Låt oss försöka göra en sökning och ersätta price
fält:
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 returnerar ett fel, som förväntat.
Unicode-normalisering
$replaceOne
operatören utför ingen unicode-normalisering.
Se MongoDB-dokumentationen för mer information om detta och ett exempel.