Definición
$replaceAllReemplaza todas las instancias de una cadena de búsqueda o patrón regex en una input string con una string de reemplazo.
$replaceAlles tanto sensible a mayúsculas como a diacríticos, e ignora cualquier intercalación presente en una colección.
Sintaxis
El $replaceAll operador tiene la siguiente sintaxis de expresión de operador:
{ $replaceAll: { input: <expression>, find: <expression>, replacement: <expression> } }
Campos de operadores
Campo | Descripción |
|---|---|
La cadena sobre la que desea aplicar la búsqueda.Puede ser cualquier expresión válida que se resuelva en una cadena o | |
La cadena que se buscará dentro de la entrada proporcionada. Puede ser cualquier expresión válida que se resuelva en una cadena, una expresión regular | |
Comportamiento
Las expresiones de entrada, búsqueda y reemplazo deben evaluarse como una cadena o un (o una expresión null regular para la búsqueda), o falla con un $replaceAll error.
$replaceAll y valores nulos
Si input o find se refieren a un campo que falta,null devuelven.
Si cualquiera de las operaciones de entrada, búsqueda o reemplazo se evalúa null como, la $replaceAll expresión completa se evalúa null como:
Ejemplo | Resultado |
|---|---|
|
|
|
|
|
|
$replaceAll y intercalación
La comparación de string para las expresiones $replaceAll siempre distingue entre mayúsculas y minúsculas y es sensible a los diacríticos. Cualquier intercalación configurada se ignora al realizar comparaciones de string con $replaceAll.
Por ejemplo, crea una colección de muestra con una fortaleza de intercalación 1:
db.createCollection( "restaurants", { collation: { locale: "fr", strength: 1 } } )
Una fuerza de intercalación de 1 compara solo el carácter base e ignora otras diferencias como el uso de mayúsculas y diacríticos.
A continuación, inserta documentos de ejemplo:
db.restaurants.insertMany( [ { _id: 1, name: "cafe" }, { _id: 2, name: "Cafe" }, { _id: 3, name: "café" } ] )
La siguiente operación de $replaceAll intenta encontrar y reemplazar todas las instancias de "Cafe" en el campo name:
db.restaurants.aggregate( [ { $addFields: { resultObject: { $replaceOne: { input: "$name", find: "Cafe", replacement: "CAFE" } } } } ] )
{ "_id" : 1, "name" : "cafe", "resultObject" : "cafe" } { "_id" : 2, "name" : "Cafe", "resultObject" : "CAFE" } { "_id" : 3, "name" : "café", "resultObject" : "café" }
Debido a que ignora la intercalación configurada para esta colección, la operación solo coincide con la instancia de "Café" en $replaceAll el 2 documento:
{ _id: 1, name: "cafe", resultObject: "cafe" } { _id: 2, name: "Cafe", resultObject: "CAFE" } { _id: 3, name: "café", resultObject: "café" }
Los operadores que respetan la intercalación, como $match, coincidirían con los tres documentos al realizar una comparación de cadenas con "Cafe" debido a la fuerza de intercalación de 1 de esta colección.
$replaceAll y Normalización Unicode
La $replaceAll expresión de agregación no realiza ninguna normalización Unicode. Esto significa que la comparación de cadenas para todas las $replaceAll expresiones tendrá en cuenta el número de puntos de código utilizados para representar un carácter en Unicode al intentar una coincidencia.
Por ejemplo, el carácter é puede representarse en Unicode usando uno o dos puntos de código:
Unicode | Se muestra como | Puntos de código |
|---|---|---|
|
| 1 ( |
|
| 2 ( |
El $replaceAll uso de con una cadena de búsqueda donde el carácter é está representado en Unicode con un punto de código no coincidirá con ninguna instancia de é que utilice dos puntos de código en la cadena de entrada.
La siguiente tabla muestra si se produce una coincidencia para la cadena de búsqueda "café" al compararla con cadenas de entrada donde é está representado por uno o dos puntos de código. La cadena de búsqueda en este ejemplo utiliza un punto de código para representar el é carácter:
Ejemplo | coincidencia |
|---|---|
| Sí |
| no |
Debido a que no realiza ninguna normalización Unicode, solo la $replaceAll primera comparación de cadenas coincide, donde tanto la cadena de búsqueda como la de entrada usan un punto de código para é representar.
Ejemplos
Crea una colección de inventory con los siguientes documentos:
db.inventory.insertMany( [ { _id: 1, item: "blue paint" }, { _id: 2, item: "blue and green paint" }, { _id: 3, item: "blue paint with blue paintbrush" }, { _id: 4, item: "blue paint with green paintbrush" }, ] )
Sustituir usando una string
El siguiente ejemplo reemplaza cada instancia de «pintura azul» en el campo item por «pintura roja»:
db.inventory.aggregate([ { $project: { item: { $replaceAll: { input: "$item", find: "blue paint", replacement: "red paint" } } } } ])
La operación devuelve los siguientes resultados:
{ _id: 1, item: "red paint" } { _id: 2, item: "blue and green paint" } { _id: 3, item: "red paint with red paintbrush" } { _id: 4, item: "red paint with green paintbrush" }
Reemplazar Usando Regex
El siguiente ejemplo utiliza un patrón regex \\bblue paint\\b para reemplazar cada instancia que coincide con “pintura azul” como frase completa en el campo item por “pintura roja”:
db.inventory.aggregate([ { $project: { item: { $replaceAll: { input: "$item", find: \\bblue paint\\b, replacement: "red paint" } } } } ])
La operación devuelve los siguientes resultados:
{ _id: 1, item: "red paint" } { _id: 2, item: "blue and green paint" } { _id: 3, item: "red paint with blue paintbrush" } { _id: 4, item: "red paint with green paintbrush" }
En este caso, "pintura azul" se reemplaza solo cuando aparece como una frase completa, debido al uso de los límites de palabras regex (\b), y no cuando es una subcadena dentro de una palabra más grande.