Be MEAN (MongoDB): save(), update() e operadores de modificação

Tempo de leitura de ~2 minutos

Rapaz, esse curso tá ficando cada vez mais denso! E isso é bom, afinal quanto mais conhecimento melhor! Vou escrever bastante, então prepare-se:

Nessa aula foi recordado que para alterar um documento no MongoDB, temos dois comandos:

db.collection.save() e db.collection.update()

Modificando documentos com save()

A diferença básica entre os dois comandos é que com o save temos que buscar e guardar o objeto numa variável, e depoooois salvá-lo no banco, dessa forma:

Primeiro buscamos o objeto: var p = db.pokemons.findOne({name:/pikachu/i})

Temos que usar findOne() pois o find() não retorna o objeto em si, mas sim um cursor. Me corrija nos comentários se eu estiver errado!

Então p terá o seguinte conteúdo:

{
  "_id": ObjectId("5650c5c8c36927f637e6ce10"),
  "name": "Pikachu",
  "description": "Rato elétrico bem fofinho",
  "type": "electric",
  "attack": 55,
  "height": 0.4
}

Agora podemos alterar um de seus valores, como por exemplo: p.attack = 50.

E daí salvamos com db.pokemons.save(p). Isso altera o valor do attack do Pikachu no banco.

Modificando documentos com update()

Já com update() é um pouco diferente. Primeiro, o update() recebe três parâmetros:

  • query (geralmente com o _id do documento que queremos modificar)
  • update (a modificação)
  • options (parâmetro opcional, veremos mais pra frente)

Com esta sintaxe: db.collection.update(query, update, options).

Podemos então criar uma query var query = {"_id": ObjectId("5652574334d59f7ade6bf57e")} que no meu caso retornará este documento:

{
  "_id": ObjectId("5652574334d59f7ade6bf57e"),
  "name": "Testemon",
  "attack": 8000,
  "defense": 8000,
  "height": 2.1,
  "description": "Pokemon de teste"
}

e um mod (parâmetro update):

var mod = {description: "Teste de modificação"}

Então passamos os parâmetros ao comando update(): db.pokemons.update(query, mod).

Executamos o comando, e ao buscar o documento no banco com db.pokemons.find(query) para ver como ficou temos este retorno:

{
  "_id": ObjectId("5652574334d59f7ade6bf57e"),
  "description": "Teste de modificação"
}

Opa! O update() não só modificou a description do nosso documento como removeu os outros campos. Isso acontece porque passamos o parâmetro de update sem usar um operador de modificação.

De acordo com a documentação do mongo:

  • O comando update() substitui o documento que corresponde a nossa query pelo documento do nosso segundo parâmetro, no nosso caso o mod
  • O comando update() não altera o _id do documento
  • O comando update() não altera múltiplos documentos de uma vez

Então para alterarmos um campo apenas, sem substituir o documento inteiro, temos de usar nossos…

Operadores de Modificação

Que são:

$set
muda o valor de um campo, criando-o caso não exista
uso: { $set: { campo: valor } }
$unset
remove campo
uso: { $unset: { campo: 1 } } colocamos 1 (true) para remover o campo
$inc
incrementa o valor do campo com a quantidade especificada
para decrementar, usar valor negativo
uso: { $inc: { campo: 1 } }

Exemplo:

var mod = {$inc: { attack: 1 }}
db.pokemons.update(query, mod)

O código acima vai apenas incrementar do campo attack do nosso registro em 1, e manter todos os outros campos intactos.

A lista segue, mas para não deixar o post muito longo vou parar por aqui, que é até onde foi abordado na aula. Mas o restante está na documentação :)

No próximo post eu continuo!

Eu disse que o curso estava ficando denso mas nem eu sabia o quanto… Já escrevi tanto e não acabou ainda! Por isso vou parar por aqui, assim não abordo muitos assuntos num post só.

Então assine meu feed RSS e/ou me siga no facebook e aguarde ;)

Be MEAN (MongoDB): Sobre upsert, multi, e operadores de query

## Olá de volta!Acredita que no dia que peguei pra assistir essa aula e escrever esse resumo, eu demorei 1 hora para assistir 12 minutos?...… Continue reading

Novo Visual do Blog!

Published on January 11, 2016

Ano novo, novas metas

Published on January 08, 2016