MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $replaceOne

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.