sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $replaceAll

El $replaceAll El operador de tubería de agregación se introdujo en MongoDB 4.4.

Este operador reemplaza todas las instancias de una cadena de búsqueda en una cadena de entrada con una cadena de reemplazo y devuelve el resultado.

Si no se encuentra la cadena de búsqueda, entonces $replaceAll devuelve la cadena de entrada.

Ejemplo

Supongamos que tenemos una colección llamada products con el siguiente documento:

{
	"_id" : 1,
	"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}

Usemos el $replaceAll operador para reemplazar la primera instancia de la cadena Left Handed con otra cadena:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{
	"_id" : 1,
	"product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case"
}

Observe que ambas instancias de la cadena de búsqueda (Left Handed ) fueron reemplazados.

Como sugiere el nombre, $replaceAll reemplaza a todos ocurrencias de la cadena de búsqueda. Para reemplazar solo el primero ocurrencia, use $replaceOne .

Sensibilidad de mayúsculas y minúsculas

El $replaceAll el operador distingue entre mayúsculas y minúsculas.

Ejemplo:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{
	"_id" : 1,
	"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}

En este caso, cambié el caso de un solo carácter en mi cadena de búsqueda. Cambié Handed a handed . Esto dio como resultado que no se encontrara la cadena de búsqueda y, por lo tanto, no se reemplazó nada. Por lo tanto, se devolvió la cadena de entrada.

Sensibilidad diacrítica

El $replaceAll el operador es sensible a signos diacríticos.

Supongamos que agregamos el siguiente documento a nuestra colección:

{ "_id": 2, "product": "Toupée Tape" }

Y ahora intentemos buscar y reemplazar la palabra Toupée , pero olvida usar el acento agudo:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
      }
   }
])

Resultado:

{ "_id" : 2, "product" : "Toupée Tape" }

Ningún cambio.

No incluí el diacrítico en mi cadena de búsqueda, por lo que no hubo ninguna coincidencia.

Aquí está de nuevo, pero esta vez incluyo el signo diacrítico:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
      }
   }
])

Resultado:

{ "_id" : 2, "product" : "Wig Tape" }

Esta vez se encontró y reemplazó la cadena de búsqueda.

Expresiones nulas

Si alguna de las expresiones proporcionadas a $replaceAll son null , el resultado es null .

Aquí hay un ejemplo de proporcionar un null campo de operador a $replaceAll :

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

En este caso el find el campo del operador era null y entonces el resultado fue null .

Campos faltantes

Si la input o find los campos de operador se refieren a un campo que no existe, entonces el resultado es null .

Ejemplo:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Resultado:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

Valores que no son cadenas

Todas las expresiones proporcionadas a $replaceAll debe evaluarse como una cadena o null . Proporcionar cualquier otro tipo devuelve un error.

Supongamos que agregamos el siguiente documento a nuestra colección:

{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }

Intentemos hacer una búsqueda y reemplazar en el price campo:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Resultado:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$replaceAll 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

Devuelve un error, como se esperaba.

Normalización Unicode

El $replaceAll el operador no realiza ninguna normalización Unicode.

Consulte la documentación de MongoDB para obtener más información sobre esto y un ejemplo.