MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $replaceAll


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.