Definição
$replaceAllSubstitui todas as instâncias de uma string de pesquisa ou padrão regex em uma string de input por uma string de substituição.
$replaceAlldiferencia maiúsculas de minúsculas e diacríticos e ignora qualquer agrupamento presente em uma collection.
Sintaxe
O $replaceAll operador tem a seguinte sintaxe de expressão de operador :
{ $replaceAll: { input: <expression>, find: <expression>, replacement: <expression> } }
Campos do operador
Campo | Descrição |
|---|---|
A string na qual você deseja aplicar a localização. Pode ser qualquer expressão válida que resolva para uma string | |
A string a usar para substituir todas as instâncias correspondentes de localização na entrada. Pode ser qualquer expressão válida que resolva para uma string |
Comportamento
As expressões de entrada, localização e substituição devem ser avaliadas como uma string ou um null (ou regex para localizar), ou falha com um $replaceAll erro.
$replaceAll e valores nulos
Se entrada ou localização se referirem a um campo ausente, elas null retornarão.
Se qualquer um de entrada, localização ou substituição for avaliado null como, a expressão inteira será $replaceAll avaliada null como:
Exemplo | Resultado |
|---|---|
|
|
|
|
|
|
$replaceAll e Agrupamento
a correspondência de strings para expressões $replaceAll sempre faz distinção entre maiúsculas e minúsculas e diacríticos. Qualquer agrupamento configurado é ignorado ao realizar comparações de strings com $replaceAll.
Por exemplo, crie uma collection de amostras com força de agrupamento 1:
db.createCollection( "restaurants", { collation: { locale: "fr", strength: 1 } } )
A força de um agrupamento de 1 compara apenas o caractere base e ignora outras diferenças, como letras maiúsculas, letras minúsculas e diacríticos.
Em seguida, insira documentos de exemplo :
db.restaurants.insertMany( [ { _id: 1, name: "cafe" }, { _id: 2, name: "Cafe" }, { _id: 3, name: "café" } ] )
A seguinte operação do $replaceAll tenta localizar e substituir todas as instâncias do "Cafe" no 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é" }
Como ignora o agrupamento configurado para essa collection, a operação só corresponde à instância de "Cafe"$replaceAll no 2 documento:
{ _id: 1, name: "cafe", resultObject: "cafe" } { _id: 2, name: "Cafe", resultObject: "CAFE" } { _id: 3, name: "café", resultObject: "café" }
Os operadores que respeitam o agrupamento, como $match, corresponderiam a todos os três documentos ao realizar uma comparação de strings de "Cafe" devido à força de agrupamento dessa collection de 1.
$replaceAll e normalização Unicode
A $replaceAll expressão de agregação não executa nenhuma normalização unicode. Isso significa que a correspondência de strings de todas as $replaceAll expressões considerará o número de pontos de código usados para representar um caractere em unicode ao tentar uma correspondência.
Por exemplo, o caractere é pode ser representado em unicode usando um ou dois pontos de código:
Unicode | Aparece como | Pontos de código |
|---|---|---|
|
| 1 ( |
|
| 2 ( |
Usar $replaceAll com uma string localização em que o caractere é é representado em unicode com um ponto de código não corresponderá a nenhuma instância de é que use dois pontos de código na string entrada.
A tabela a seguir mostra se ocorre uma correspondência para uma string localização de "café" quando comparado a strings de entrada em é que é representado por um ou dois ponto de código. A string localização nesse exemplo usa um ponto de código para representar o é caractere:
Exemplo | corresponder |
|---|---|
| sim |
| no |
Como não executa nenhuma normalização unicode,$replaceAll somente a primeira comparação de strings corresponde, onde as strings de localização e entrada usam um ponto de código para é representar.
Exemplos
Cria uma collection inventory com os seguintes 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" }, ] )
Substituir usando uma string
O exemplo a seguir substitui cada instância de "tinta azul" no campo item por "tinta vermelha":
db.inventory.aggregate([ { $project: { item: { $replaceAll: { input: "$item", find: "blue paint", replacement: "red paint" } } } } ])
A operação retorna os seguintes 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" }
Substitua usando Regex
O exemplo a seguir usa um padrão regex \\bblue paint\\b para substituir cada instância correspondente a "blue paint" como uma frase inteira no campo item por "red paint":
db.inventory.aggregate([ { $project: { item: { $replaceAll: { input: "$item", find: \\bblue paint\\b, replacement: "red paint" } } } } ])
A operação retorna os seguintes 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" }
Nesse caso, "tinta azul" é substituído somente quando aparece como uma frase inteira, devido ao uso de limites de palavras regex (\b), e não quando é uma substring dentro de uma palavra maior.