Definição
$renameO operador
$renameatualiza o nome de um campo.
Sintaxe
{ $rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
O novo nome de campo deve ser diferente do nome de campo existente. Para especificar um <field> em um documento incorporado, use notação de ponto de ponto.
Considere o seguinte exemplo:
db.students.updateOne( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
A operação anterior renomeia o campo nickname para alias e o campo cell para mobile em um documento onde _id é 1.
Comportamento
Ao executar uma operação do $rename, o MongoDB executa as seguintes ações:
Excluir o antigo
<field>e o campo com<newName>do documento (usando$unset).Executar uma operação
$setcom<newName>, usando o valor de<field>.
Atomicidade
Cada documento correspondido por um comando de atualização é atualizado em uma operação individual. As operações de atualização (como $rename) só garantem a atomicidade em um único documento.
Ordem do campo
A operação $rename pode não preservar a ordem dos campos no documento.
Atualizar ordem de processamento
A partir do MongoDB 5.0, os operadores de atualização processam campos de documento com nomes baseados em cadeia de caracteres em ordem lexicográfica. Os campos com nomes numéricos são processados em ordem numérica. Consulte Atualizar Comportamento de Operadores para detalhes.
Renomear campos de documentos incorporados
O operador $rename pode mover campos para dentro e para fora de documentos incorporados.
$rename não funciona em documentos incorporados em arrays.
Outras Considerações
Se o documento já tiver um campo com o
<newName>, o operador$renameremoverá esse campo e renomeará o<field>especificado para<newName>.Se o campo para renomear não existir em um documento,
$renamenão fará nada.A partir do MongoDB 5.0,
mongodnão gera mais um erro ao usar um operador de atualização como$renamecom uma expressão de operando vazia ({ }). Uma atualização vazia não resulta em alteração e nenhuma entrada no oplog é criada (o que significa que é sem operação).
Exemplos
Crie a coleção students:
db.students.insertMany( [ { "_id": 1, "alias": [ "The American Cincinnatus", "The American Fabius" ], "mobile": "555-555-5555", "nmae": { "first" : "george", "last" : "washington" } }, { "_id": 2, "alias": [ "My dearest friend" ], "mobile": "222-222-2222", "nmae": { "first" : "abigail", "last" : "adams" } }, { "_id": 3, "alias": [ "Amazing grace" ], "mobile": "111-111-1111", "nmae": { "first" : "grace", "last" : "hopper" } } ] )
Os documentos contêm um erro, nmae deve ser name. Os exemplos nas seções a seguir atualizam os documentos na collection.
Renomear um campo
Para renomear um campo, chame o operador $rename com o nome atual do campo e o novo nome:
db.students.updateMany( { "nmae": { $ne: null } }, { $rename: { "nmae": "name" } } )
Esta operação verifica se há documentos em que o campo nmae não é nulo e atualiza esses documentos para renomear o campo nmae para name:
{ "_id": 1, "alias": [ "The American Cincinnatus", "The American Fabius" ], "mobile": "555-555-5555", "name": { "first" : "george", "last" : "washington" } } { "_id" : 2, "alias" : [ "My dearest friend" ], "mobile" : "222-222-2222", "name" : { "first" : "abigail", "last" : "adams" } } { "_id" : 3, "alias" : [ "Amazing grace" ], "mobile" : "111-111-1111", "name" : { "first" : "grace", "last" : "hopper" } }
Renomear um campo em um documento incorporado
Para renomear um campo em um documento incorporado, chame o operador $rename usando a notação de ponto para se referir ao campo. Se o campo tiver que permanecer no mesmo documento incorporado, use também a notação de ponto no novo nome, como no exemplo a seguir:
db.students.updateOne( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )
Esta operação renomeia o campo incorporado first para fname:
{ _id: 1, alias: [ 'The American Cincinnatus', 'The American Fabius' ], mobile: '555-555-5555', name: { last: 'washington', fname: 'george' } }
Renomear um campo que não existe
Ao renomear um campo e o nome de campo existente refere-se a um campo que não existe, o operador $rename não faz nada, como a seguir:
db.students.updateOne( { _id: 1 }, { $rename: { 'wife': 'spouse' } } )
Esta operação não faz nada porque não há nenhum campo chamado wife.