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?

Pois é, escrever esses resumos está tomando muito tempo! Por um lado é bom, porque quanto mais você se ocupa com um assunto melhor você aprende ele (vi um vídeo muito legal sobre isso ontem: https://youtu.be/PHnBUw1bUCU).

Porém infelizmente não acho que vou conseguir continuar fazendo isso até o final do curso. Parece que estou traduzindo a documentação do MongoDB. Aliás, escrever essa documentação deve dar um trabalho incrivelmente demorado, parabéns a quem faz isso!

Meu objetivo é pelo menos terminar de fazer os resumos do módulo de MongoDB, e aí arrumar outra estratégia para resumir, talvez com mapas mentais :)

Mas até lá, vou continuar escrevendo ;) Aliás, agora me sinto mais satisfeito, pois posso dizer que estou cumprindo mais uma meta para o blog em 2016 :D

Começando a aula

Relembrando a sintaxe do comando update(), temos:

db.collection.update(query, update, options)

E hoje veremos mais sobre o parâmetro options.

options

options é um objeto com a seguinte sintaxe:

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

{

upsert
Caso o objeto da sua query não seja encontrado para ser modificado, ele será criado automaticamente pelo update()
Valor padrão: false

Então se formos mudar um campo de um objeto e ele não encontrar esse objeto, o mongo irá criar um novo objeto com esse campo e valor, porém só com esse campo e valor que pedimos para modificar. Por exemplo, vamos buscar um pokemon com um nome inexistente e alterar o campo active:

var query = {name: /inexistente/i}
var mod = {$set:{active:true}}
var options = {upsert:true}
db.pokemons.update(query,mod,options)

O resultado será:

WriteResult({
  "nMatched": 0,
  "nUpserted": 1,
  "nModified": 0,
  "_id": ObjectId("5696d7c5d37af6f34881ad92")
})

Porém o objeto criado só contém:

{
  "_id": ObjectId("5696d7c5d37af6f34881ad92"),
  "active": true
}

Eu mesmo na primeira vez esperei que o mongo adicionasse o objeto com name: inexistente, mas ele só insere os campos do parâmetro mod.

Inserindo valores padrão para novos objetos ($setOnInsert)

Caso o upsert esteja ligado e o mongo não encontre o objeto a ser modificado, ele vai criar um novo com os campos e valores passados para modificação. Com o operador $setOnInsert, nós podemos setar valores padrão para o mongo usar nos novos objetos:

var query = {name: /NaoExisteMon/i}
var mod = {
  $set: {active: true},
  $setOnInsert: {
    name: "NaoExisteMon",
    attack: null,
    defense: null,
    height: null,
    description: "Sem maiores informações"}
}
var options = {upsert: true}
db.pokemons.update(query, mod, options)

O código acima vai alterar o campo active do objeto com name: NaoExisteMon, e caso o objeto não exista ele vai criar com os campos name, attack, defense, height, description e active, com seus respectivos valores.

Alterando múltiplos documentos

No MongoDB, caso você queira alterar mais de um documento, utilizando apenas uma query, é necessário mudar o multi para true. Como vimos mais acima, o multi faz parte das options.

Então caso queiramos inserir o campo active em todos os pokemons (e alterá-los para false caso já exista), fazemos:

var query = {}
var mod = {
  $set: {
    active: false
  }
}
var options = {
  multi: true
}
db.pokemons.update(query, mod, options)

Voltando ao find()

Operador $in

Nesse momento da aula foi apresentado o operador $in, do comando find(). Vamos direto ao exemplo:

var query = {moves:{$in: [/choque do trovão/i]}}
db.pokemons.find(query)

O operador $in vai retornar os documentos que possuírem os itens pedidos. No caso o campo moves é um array, e a busca vai retornar todos os documentos que tiverem o item choque do trovão no campo moves.

Operador $nin

E é claro que temos o operador $nin (not in), que faz justamente o inverso, retorna os documentos que não tiverem nenhum dos valores passados.

Operador $all

Se você conhece programação deve estar imaginando que também temos um operador tipo AND, e temos: $all.

Esse operador só retorna documentos que tenham todos os itens passados.

Operador $ne

Continuando a sequência de operadores, temos o $ne (not equal), que como se pode supor, retorna documentos cujo o valor do campo seja diferente do passado na query. Exemplo:

var query = {type: {$ne: 'grama'}}
db.pokemons.find(query)

Retorna todos os pokemons que não são do tipo grama.

Obs.: esse operador não aceita regex, caso tente usar algo como var query = {name: {$ne: /pikachu/i}}, vai dar o seguinte erro:

Error: error: {
  "$err": "Can't canonicalize query: BadValue Can't have regex as arg to $ne.",
  "code": 17287
}

Operador $not

Quase o mesmo que o operador anterior, porém inclui documentos que não contenham o campo especificado, e também permite regex.

Removendo documentos

remove()

O comando remove() remove todos os documentos encontrados na query, por exemplo:

var query = {name: \squirtle\i}
db.pokemons.remove(query)

drop()

O drop() serve para remover uma coleção inteira :)

Leia a documentação!

Lembre-se de que todos os tópicos aqui descritos estão melhor explicados na documentação oficial do MongoDB ;)

Que prazer em ver esse visual novo, limpo e bonito! Confesso que o tema não é meu, mas é tão bonito que decidi usar assim mesmo. O link do tema original é este:

Esse tema tem pequenos detalhes que bem interessantes, como imagem de fundo personalizada para cada post e tempo de leitura.

O novo visual

Uma das coisas que mais gostei é a simplicidade. O menu já fica compactado por padrão, e na página de post não temos nada além do título, tempo de leitura, data, e o conteúdo.

O que eu modifiquei

Basicamente foi a fonte do título, o formato da data e traduzi os termos do inglês para o português.

As modificaçoes

Enfim, estou feliz por já ter riscado uma das metas iniciais do ano para este blog. Então vamos em frente porque há muito por vir!

Parece que não consigo escrever posts para este blog a não ser durante a transição da noite para a madrugada… Mas não me sinto parte daquele grupo que se diz mais produtivo durante a madrugada. Na verdade, parece que eu só escrevo aqui de madrugada porque sinto que não fui produtivo o suficiente durante o dia e preciso fazer mais algo.

Há tantas ideias que vêm à mente e tantas coisas que quero fazer, que me frustro ao não ver os projetos avançando. Também têm sido meses difíceis para mim aqui em casa, especialmente financeiramente. Inclusive se você trabalha com desenvolvimento web e gostar do meu perfil pode entrar em contato viu ;)

Enfim, chega disso e vamos em frente! Este post é só pra atualizar o blog e registrar 3 metas que tenho:

  • Mudar o tema do blog
  • Escrever sobre os 3 desafios de programação que fiz e tudo que aprendi com eles
  • Continuar com as aulas do Be MEAN

Por enquanto é isso, e se você também se sente mal por não conseguir fazer tudo o que queria, vá com calma e prossiga com constância, e o mais importante, risque as tarefas da sua todo list ;)

Continuando o post anterior onde vimos o comando update() e seus operadores de modificação, hoje vou relatar o que eu aprendi sobre operadores de array.

Operadores de Array

$push
Adiciona um valor ao campo, caso o campo seja um Array existente
Caso não exista irá criar um novo do tipo Array e adicionar o valor passado
Se o campo não for do tipo Array, retorna um erro
Uso: { $push : { campo : valor } }
$pushAll
O mesmo que o item anterior, porém serve para adicionar vários valores ao array
Uso: { $pushAll : { campo : [Array_de_valores] } }
$pull
Retira o valor do campo, case seja do tipo Array
Se o campo não existir, não vai fazer nada
Uso: { $pull : { campo : valor } }
$pullAll
O mesmo que o item anterior, porém serve para remover vários valores do array
Uso: { $pullAll : { campo : [Array_de_valores] } }

Já acabou

Esta na verdade é uma continuação do último post da série Be MEAN. No dia daquele post eu já não podia continuar escrevendo e por isso deixei esta parte pra depois.

Demorei um pouco pra fazer este post, mas agora que estou de férias é hora de decolar com os projetos!

Estou atrasado com as aulas do Be MEAN, eu sei, mas assim que passar essa semana de provas eu volto com tudo. Além disso, essa semana eu estava focado em um desafio para uma vaga de estágio, que foi bem… desafiador!

Stackedit.io

Quero relatar que passei a utilizar mais o stackedit.io, editor markdown online. Eu já conhecia há um tempo, mas só passei a utilizá-lo agora, depois que mudei o processador de markdown do blog para o kramdown.

Editar markdown no stackedit é bem gostoso, mas tem alguns probleminhas também, como não destacar links que referenciam a um endereço um tanto diferente do comum:

stackedit não destaca links não convencionais

E também não é possível (ou não sei como) escapar trechos de código que não quero formatar como bloco de código:

como escapar código no markdown?

PS: já tentei “\” e não deu certo.

Fora isso, estou gostando mais de usar o stackedit.io do que o atom, especialmente por causa do preview e os atalhos do teclado.

Desafio: aplicação em Ruby on Rails

Sobre o desafio, tratava-se de uma aplicação que permitisse gerenciar e compartilhar playlists de músicas. Aparentemente simples, mas que mesmo assim foi bem desafiador. Tive de aprender os conceitos básicos sobre Ruby, Ruby on Rails, migrations, generators, entre outros.

E apesar disso ter me impossibilitado de postar no blog e ver as aulas do Be MEAN, a boa notícia é que tenho um conteúdo bem legal pra postar sobre o que aprendi em ruby e ruby on rails :D

Estou nas últimas aulas do semestre na faculdade, então ainda vai ficar bem difícil atualizar o blog, mas vou ficar feliz se você assinar o RSS do blog :)

Por enquanto é isso, até o próximo!