O
$replaceAll
O operador de pipeline de agregação foi introduzido no MongoDB 4.4. Este operador substitui todas as instâncias de uma string de pesquisa em uma string de entrada por uma string de substituição e retorna o resultado.
Se a string de pesquisa não for encontrada,
$replaceAll
retorna a string de entrada. Exemplo
Suponha que tenhamos uma coleção chamada
products
com o seguinte documento:{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Vamos usar o
$replaceAll
operador para substituir a primeira instância da string Left Handed
com outra string: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 as instâncias da string de pesquisa (
Left Handed
) foram substituídos. Como o nome sugere,
$replaceAll
substitui todos ocorrências da string de pesquisa. Para substituir apenas o primeiro ocorrência, use $replaceOne
. Sensibilidade de maiúsculas e minúsculas
O
$replaceAll
operador diferencia maiúsculas de minúsculas. Exemplo:
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" }
Nesse caso, alterei o caso de um único caractere na minha string de pesquisa. Eu mudei
Handed
para handed
. Isso resultou na não localização da string de pesquisa e, portanto, nada foi substituído. Portanto, a string de entrada foi retornada. Sensibilidade diacrítica
O
$replaceAll
operador é sensível ao diacrítico. Suponha que adicionamos o seguinte documento à nossa coleção:
{ "_id": 2, "product": "Toupée Tape" }
E agora vamos tentar pesquisar e substituir a palavra
Toupée
, mas esqueça de usar o acento agudo:db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Resultado:
{ "_id" : 2, "product" : "Toupée Tape" }
Nenhuma mudança.
Não incluí o diacrítico na minha string de pesquisa e, portanto, não houve correspondência.
Aqui está novamente, mas desta vez eu incluo o diacrítico:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Resultado:
{ "_id" : 2, "product" : "Wig Tape" }
Desta vez, a string de pesquisa foi encontrada e substituída.
Expressões nulas
Se alguma das expressões fornecidas para
$replaceAll
são null
, o resultado é null
. Aqui está um exemplo de como fornecer um
null
campo operador para $replaceAll
:db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultado:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Neste caso, o
find
campo do operador era null
e assim o resultado foi null
. Campos ausentes
Se a
input
ou find
campos de operador referem-se a um campo que não existe, então o resultado é null
. Exemplo:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Resultado:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Valores não string
Todas as expressões fornecidas para
$replaceAll
deve ser avaliado como uma string ou null
. Fornecer qualquer outro tipo retorna um erro. Suponha que adicionamos o seguinte documento à nossa coleção:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Vamos tentar fazer uma pesquisa e substituir pelo
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
Ele retorna um erro, conforme o esperado.
Normalização Unicode
O
$replaceAll
operador não executa nenhuma normalização unicode. Consulte a documentação do MongoDB para obter mais informações sobre isso e um exemplo.