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