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.