Il $replaceOne
l'operatore della pipeline di aggregazione è stato introdotto in MongoDB 4.4.
Questo operatore sostituisce la prima istanza di una stringa di ricerca in una stringa di input con una stringa di sostituzione e restituisce il risultato.
Se la stringa di ricerca non viene trovata, allora $replaceOne
restituisce la stringa di input.
Esempio
Supponiamo di avere una collezione chiamata products
con il seguente documento:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Usiamo il $replaceOne
per sostituire la prima istanza della stringa Left Handed
con un'altra stringa:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Risultato:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Nota che in realtà ci sono due istanze della stringa di ricerca (Left Handed
) ma solo la prima istanza è stata sostituita.
Per sostituire tutte le istanze, usa $replaceAll
operatore.
Maiuscole/minuscole
Il $replaceOne
l'operatore fa distinzione tra maiuscole e minuscole.
Esempio:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Risultato:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
In questo caso, ho cambiato il caso di un singolo carattere nella mia stringa di ricerca. Ho cambiato Handed
a handed
. Ciò ha comportato che la stringa di ricerca non è stata trovata e quindi non è stato sostituito nulla. Pertanto, è stata restituita la stringa di input.
Sensibilità diacritica
Il $replaceOne
l'operatore è sensibile ai segni diacritici.
Supponiamo di aggiungere il seguente documento alla nostra raccolta:
{ "_id": 2, "product": "Toupée Tape" }
E ora proviamo a cercare e sostituire la parola Toupée
, ma dimentica di usare l'accento acuto:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Risultato:
{ "_id" : 2, "product" : "Toupée Tape" }
Nessun cambiamento.
Non ho incluso il segno diacritico nella stringa di ricerca e quindi non c'era corrispondenza.
Eccolo di nuovo, ma questa volta includo il segno diacritico:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Risultato:
{ "_id" : 2, "product" : "Wig Tape" }
Questa volta la stringa di ricerca è stata trovata e sostituita.
Espressioni nulle
Se una qualsiasi delle espressioni fornite a $replaceOne
sono null
, il risultato è null
.
Ecco un esempio di fornire un null
campo operatore a $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Risultato:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
In questo caso il find
il campo dell'operatore era null
e quindi il risultato è stato null
.
Campi mancanti
Se il input
o find
i campi operatore si riferiscono a un campo che non esiste, quindi il risultato è null
.
Esempio:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Risultato:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Valori non stringa
Tutte le espressioni fornite a $replaceOne
deve restituire una stringa o null
. Fornire qualsiasi altro tipo restituisce un errore.
Supponiamo di aggiungere il seguente documento alla nostra raccolta:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Proviamo a fare una ricerca e sostituire sul price
campo:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Risultato:
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
Restituisce un errore, come previsto.
Normalizzazione Unicode
Il $replaceOne
l'operatore non esegue alcuna normalizzazione Unicode.
Consulta la documentazione di MongoDB per ulteriori informazioni su questo e un esempio.