terça-feira, 22 de dezembro de 2015

MongoDB - Update


Nesse post será abordado a atualização no banco de dados.

Se você leu o post sobre a inserção, viu que existe o save, que serve tanto para inserir documentos como para alterar. Para alterarmos o documento no save precisamos busca o documento, modificar e salvar, já no update você não tem todo esse trabalho, até porque ele permite que você altere mais de um documento de uma vez.

A função update recebe 3 parâmetros:
Query
Modificação
Options

E sua sintaxe é:
db.collection.update(query, mod, options)

No update o parâmetro options é opcional.

As buscas que fazemos é case-sensitive, para fazermos pesquisas case-insensitive é preciso usar RegExp (expressões regulares) do JavaScript. Assim:
/pikachu/i

Agora iremos fazer uma atualização no documento do Pikachu, adicionando o campo description ao documento…

Vamos lá…

Execute os seguintes comandos...

var query = {name: /pikachu/i}
query = db.pokemons.findOne(query, {_id: 1})
var poke = db.pokemons.findOne(query, {_id: 0})
var mod = {description: “O Pikachu é um dos pokémons mais famosos.”}
db.pokemons.update(query, mod)
db.pokemons.findOne(query)

Viu o que aconteceu? Perdemos os campos que tinhamos e ficou apenas o _id e a description. Por isso fiz aquela query receber o _id do documento, pois não teríamos mais como pesquisar pelo nome. Sabendo que perderia os dados também salvei eles na variável poke para que pudéssemos deixar como estava antes. Então faça...
db.pokemons.update(query, poke)

Para podermos atualizar corretamente os dados, precisamos usar operadores de modificação.

Operadores de modificação

O operador $set modifica um valor ou cria ele, caso não exista. Sua sintaxe é a seguinte:
{ $set: {campo: valor, campo: valor, …} }
Se queremos adicionar a description precisamos fazer o mod da seguinte forma:
var mod = {$set: {description: “O Pikachu é um dos pokémons mais famosos.”} }
db.pokemons.update(query, mod)

Se podemos criar e alterar campos, também podemos remove campos de nossos documentos, basta usar o $unset. Sua sintaxe:
{$unset: {description: 1}}
Para apagarmos a description que inserimos no documento, basta fazermos isso…
var mod = {$unset: {description: 1}}
db.pokemons.update(query, mod)

Para fazermos o incremento em campos numéricos, usamos o $inc onde passamos o campo e a quantidade que desejamos incrementar, caso passe um valor negativo será decrementado e caso o campo não exista, o campo será criado e setado com o valor que você passou.
{$inc: {campo: valor}}

Veja como é fácil incrementar. Iremos adicionar +1 no attack do Pikachu.
var mod = {$inc: {attack: 1}}
db.pokemons.update(query, mod)

Para podermos fazer modificações em campos que sejam array, precisamos dos Operadores de Array.

Para inserirmos elementos no campo que seja Array, usaremos o $push. Caso o campo que você vá inserir não seja uma Array, ele irá retornar um erro.
{$push: {campo: valor}}

Vamos adicionar moves ao Pikachu.
var mod = {$push: {moves: “Choque do trovão”}}
db.pokemons.update(query, mod)

O $push adiciona apenas um valor por vez ao campo. Para adicionarmos mais de um valor de uma única vez, devemos utilizar o $pushAll:
{$pushAll: {campo: [Array_de_valores]}}

Mais uma vez, se podemos adicionar valores em um capo do tipo array, também podemos remover valores desses campos. Basta utilizar o $pull:
{$pull: {campo: valor}}

O $pull remove apenas um valor por vez. Para removermos mais de um valor de uma única vez, usaremos o $pullAll
{$pullAll: {campo: [Array_de_valores]}}

Todos esses operadores de modificação de array, se usados em campos que não são array irá retornar um erro.

Options

Com o objeto options podemos configurar alguns valores diferentes do padrão. O options possui os seguintes parâmetros:

{
upsert: boolean,
multi: boolean,
writeConcern: document
}

Por padrão o upsert e o multi são falsos.

Upsert
Esse parâmetro serve para caso o documento que você pesquise não seja encontrado pela query, ele irá criar e inserir um novo documento contendo apenas os campos passados no mod.

$setOnInsert
Esse operador serve para você definir valores que serão adicionados quando ocorrer um upsert, afinal, você não vai querer que o upsert crie um documento com apenas um campo né!?

Como fazer isso?
Você passa esse operador no mod. Veja mais ou menos como ficaria:
var mod = { $set: {active: true}, $setOnInsert: {name: null, attack: null, defense: null, height: null, type: null} }
Então… Se você deixar o upsert setado como true e se ao fazer a busca no update e ele não encontrar o documento, ele automaticamente criara um documento contendo os campos do setOnInsert e com o campo set. Se ele encontrar o documento ele apenas faz o set.

Multi
Por padrão, o update permite que você modifique apenas um documento por vez, isso porque o multi vem setado como false, para evitar que você faça sem querer aquele famoso, update sem where. Para setar como true, basta:
var mod = {multi: true}

writeConcern
Esse operador descreve a garantia de que o MongoDB fornece ao relatar o sucesso de uma operação de escrita. Para saber mais, dê uma olhada na documentação do Mongo ;)

0 comentários:

Postar um comentário