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

MongoDB $replaceOne


O $replaceOne O operador de pipeline de agregação foi introduzido no MongoDB 4.4.

Este operador substitui a primeira instância 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, $replaceOne 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 $replaceOne operador para substituir a primeira instância da string Left Handed com outra string:
db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

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

Observe que na verdade existem duas instâncias da string de pesquisa (Left Handed ), mas apenas a primeira instância foi substituída.

Para substituir todas as instâncias, use o $replaceAll operador.

Sensibilidade de maiúsculas e minúsculas


O $replaceOne operador diferencia maiúsculas de minúsculas.

Exemplo:
db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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 $replaceOne 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: { $replaceOne: { 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: { $replaceOne: { 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 $replaceOne são null , o resultado é null .

Aqui está um exemplo de como fornecer um null campo operador para $replaceOne :
db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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: { $replaceOne: { 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 $replaceOne 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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Resultado:
Error: command failed: {
	"ok" : 0,
	"errmsg" : "$replaceOne 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 $replaceOne operador não executa nenhuma normalização unicode.

Consulte a documentação do MongoDB para obter mais informações sobre isso e um exemplo.