segunda-feira, 22 de julho de 2013

     No post Primeiros Passos com MongoDB aprendemos sobre usar um banco de dados e suas collections, inserir documentos, e o elementar sobre comando find().

     Na sequência de posts que iniciamos agora, falaremos de uma forma mais completa sobre os operadores para Criar, Ler, Atualizar e Apagar dados (em inglês, Create, Read, Update e Delete - CRUD). Começaremos apenas com o shell do MongoDB para, na sequência, realizarmos as mesmas operações em Python.
   Nesta série de posts vamos trabalhar com o dataset zips que contém dados sobre as cidades (latitude, longitude, população e ceps) e estados dos EUA. Ele pode ser baixado neste link: download dataset. Insira os dados utilizando o comando mongoimport (veja neste post como fazer: Como importar arquivos no MongoDB).

     No shell, os comandos find() e findOne() são os métodos utilizados para leitura de dados. O comando findOne() retorna apenas um documento, e geralmente é utilizado para verificarmos como é a estrutura dos dados. Em um exemplos temos:

db.zips.findOne()



     Já o find() possui a seguinte sintaxe:

db.collection.find(<query>,<projection>)

     As queries no MongoDB são objetos BSON, dotados de uma série de query operator para descrever os parâmetros desejados. O argumento <projection> especifica ou limita os campos que a query retornará, e, se omitido, fará a consulta retornar todos os dados do documento.
     Vamos fazer uma consulta no banco para encontrar os dados de Chicago:

query = {city:'CHICAGO'}
db.zips.find(query)

     Note que usamos como argundo do find() a variável query com o objeto da consulta. Isto será muito útil quando formos trabalhar com Python. A mesma consulta pode ser feita utilizando

db.zips.find({city:'CHICAGO'})

nosso resultado será o mesmo.


    Esta consulta nos retorna vários documentos pois as cidades possuem um documento para cada CEP existente (representado pela chave "_id"). Para retornar apenas um resultados, passamos a variáveis como argumento do comando findOne().

db.zips.findOne(query)


Como saber quantos CEPs existem em Chicado? Usando count().

db.zips.find(query).count()


     Se desejássemos apenas saber a população contida em cada CEP, utilizamos o <projection> como parâmetro no find().

projection = {_id:0, city:1, pop:1}
db.zips.find( query, projection)


     Mas o que realmente temos aqui? As chaves que desejamos ver na consulta devem estar no comando com a sintaxe chave_desejada:1. Temos no caso o _id:0 pois é a única chave que sempre retornará na consulta, ao menos que seja especificado o contrário.

     Deixando nossas consultas mais elaboradas, como podemos fazer para consultar subdocumentos, já que o MongoDB é schemaless? A sintaxe é (observe que temos as chaves da consulta entre aspas simples):

db.collection.find('chave_doc.chave_subdoc':valor)

que é a chamada notação ponto (dot notation). Nossa base exemplo não possui nenhum subdocumento. Mas para não deixarmos de dar um exemplo, considere esta collection:

db.tecno.insert({produto:'tablet', model:{Ipad:'Apple', Galaxy:'Samsumg'}})
db.tecno.insert({produto:'celular', model:{Xperia:'Sony', Lumia:'Nokia'}})

e o find():

db.tecno.find({'fabricante.Nokia':Lumia},{_id:0,produto:'})


     Para fecharmos esta seção, vamos explorar como fazer consulta em documentos que contem arrays. Novamente, a ideia é usar dot notation para consultar os documentos de acordo com sua posição no array, ou também poderemos ser menos específico, consultado diretamente. Voltando ao nosso dataset, vamos fazer uma consulta usando o campo que contem arrays (no caso o 'loc') e tentar identificar qual a cidade que contém a longitude 40.77638.

db.zips.find({'loc.1':40.77638})


     Como resposta, encontramos a cidade de New York. Perceba que o array loc possui a sintaxe [latitude,longitude] com as respectivas posições no vetor [0,1]. Por esta razão, utilizamos 'loc.1'.

     Finalizamos nosso primeiro post sobre as CRUD Operations no MongoDB. 

     Até o próximo!



0 comentários:

Postar um comentário