Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No desenvolvimento de aplicações que utilizam bancos de dados NoSQL, como o Firestore, uma dúvida recorrente é como modificar apenas um campo específico dentro de um objeto complexo, sem alterar ou remover os demais dados associados. Este cenário é comum em aplicações que trabalham com estruturas de dados aninhadas, onde a precisão na atualização é fundamental para manter a integridade e consistência.
update() passando um objeto com a chave e valor desejados muitas vezes acaba sobrescrevendo o objeto completo, eliminando os campos que não foram explicitamente incluídos na operação.
Por exemplo, ao tentar atualizar apenas o campo test dentro do objeto first, usando uma estrutura como:
var setAda = db.collection('users').doc('alovelace').update({ first: { test: "12345" } }).
e, na prática, o resultado é que o objeto first passa a conter somente o campo test, removendo o test2 ou quaisquer outros que estavam presentes anteriormente. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
update(). Quando você fornece um objeto { first: { test: "12345" } }, a operação interpreta como uma substituição completa do campo first, não como uma atualização parcial. Assim, o Firestore substitui o valor inteiro de first pelo novo objeto, descartando atributos existentes.
Por exemplo:
var updateField = db.collection('users').doc('alovelace').update({ "first.test": "12345" }).
Essa operação irá modificar somente o campo test dentro do objeto first, deixando o restante intacto. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
{
"first": {
"test": "abc",
"test2": "xyz"
}
} Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Para atualizar apenas o test, faça:
db.collection('users').doc('alovelace').update({ "first.test": "12345" }). A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
O resultado será:
{
"first": {
"test": "12345",
"test2": "xyz"
}
} Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
no meu time, às vezes esquecemos de verificar a estrutura antes de atualizar, aí acaba sobrescrevenddo tudo. essa abordagem ajuda a prevenir esses problemas.
duvido! essa dica de usar a notação de pono sempre funciona bem pra mim, evita umas dores de cabeça na hora de atualizar só um campo interno. Acho que é uma prática que o time devia adotar mais.
boa, mas cuidado ao encadear múltiplas atualizações com notação de ponto, pode ficar difícil de manter se a estrutura for muito profunda.
exato, e vale testar sempre em staging pra cuidar para que o update não vai afetar outros campos que não deveriam ser alterados.