Conectando Java com MongoDB
Vimos em um post passado o MongoDB e agora vamos ver como conectamos a ele em Java.
Antes de qualquer coisa temos de baixar o driver e para isso basta baixá-lo da área de drivers do site do MongoDB e adicioná-lo ao seu classpath.
Conectar ao MongoDB é bastante simples, basta instanciar a classe Mongo
e depois selecionar o banco.
Mongo m = new Mongo();
// ou
Mongo m = new Mongo( "localhost" );
// ou
Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "meu_banco" );
Acredito que a parte mais complicada é transformar um documento no estilo JSON em um objeto BasicDBObject
que a maioria dos métodos da API recebe. Vamos fazer um exemplo:
{
nome : "Rodrigo",
sobrenome : "Aramburu",
telefone : "1234-5678",
endereco : {
rua : "Rua Fulano",
numero : "221B",
bairro : "Centro"
}
}
Convertendo este objeto JSON para objeto Java ficaria assim:
BasicDBObject pessoa = new BasicDBObject();
pessoa.put("nome", "Rodrigo");
pessoa.put("sobrenome", "Aramburu");
pessoa.put("telefone", "1234-5678");
BasicDBObject end = new BasicDBObject();
end.put("rua", "Rua Fulano");
end.put("numero","221B");
end.put("bairro", "Centro");
pessoa.put("endereco", end);
Na linha 1 criamos um objeto BasicDBObject
, na linhas 2 , 3 e 4 adicionamos os campos nome, sobrenome e telefone e seus valores. O campo endereco
é um campo que o valor é um objeto incorporado então antes de adicionarmos ele devemos criar este objeto(linha 6) e incluir seus campos(linhas 7, 8 e 9). Com o objeto endereco
podemos inserir no campo endereco
do objeto pessoa.
Se você se perguntou e se tivesse vários telefones? Simples!
String[] tels = { "1234-5678","9898-9898" };
pessoa.put("telefone", tels);
Com o Objeto criado, inserir no MongoDB é muito simples :
DBCollection colecaoPessoas = db.getCollection("pessoas");
colecaoPessoas.insert(pessoa);
Bom depois de inserir sempre é bom buscar então vamos lá:
DBCursor cursor = coll.find();
while( cursor.hasNext() ){
BasicDBObject pessoa = (BasicDBObject) cursor.next();
System.out.println( "Nome: "+pessoa.getString("nome") );
System.out.println("Sobrenome: "+pessoa.getString("sobrenome") );
System.out.println("Telefone: "+pessoa.getString("telefone") );
BasicDBObject end = (BasicDBObject) pessoa.get("endereco");
System.out.println( "Rua: "+end.getString("rua") );
System.out.println( "Numero: "+end.getString("numero") );
System.out.println( "Bairro: "+end.getString("bairro") );
System.out.println( "======================================" );
}
Para fazer uma consulta se utiliza o método find
que retorna um DBCursor
que permite iterar sobre o resultado, os métodos mais importantes são hasNext()
que retorna true se tiver o próximo documento e falso se não tiver mais. E o método next(
) que retorna o próximo DBObject
do qual utilizamos o método getString("nome_campo")
ou getInteger("nome_campo")
, getBoolean("nome_campo")
, getDouble("nome_campo")
para pegar os dados.
E como colocamos alguns critério de busca?
BasicDBObject query = new BasicDBObject();
query.put("telefone","9898-9898");
DBCursor cursor = coll.find(query);
Para filtrar basta passar por parâmetro um objeto BasicDBObject
para o método find() e podemos utilizar todos os tipos de filtros, $in
, $lte
, $gt
, $or
, $regex
, etc…
BasicDBObject query = new BasicDBObject();
query.put("idade", new BasicDBObject().append("$gt", 18));
DBCursor cursor = coll.find(query);
O interessante no filtro $in
é que podemos utilizar uma coleção:
BasicDBObject query = new BasicDBObject();
List<Integer> list = new ArrayList<Integer>();
list.add(9);
list.add(10);
query.put("idade", new BasicDBObject().append("$in", list));
Bom agora vamos deletar
BasicDBObject obj = new BasicDBObject();
obj.put("_id", new ObjectId( "4e827ca3d6340373c65e4e99" ) );
colecaoPessoas.remove(obj);
Normalmente eu prefiro deletar pelo _id
e o valor deste campo é um objeto do tipo ObjectId("id")
, criar um objeto BasicDBObject
para depois passá-lo de parâmetro para o método remove()
.
Só falta atualizar
BasicDBObject ant = new BasicDBObject();
ant.put("_id", new ObjectId( "4e8279f7d63465f846d5cea9" ) );
BasicDBObject novo = new BasicDBObject();
novo.put("$set", new BasicDBObject().append("idade", 16));
colecaoPessoas.update(ant, novo);
Bom era isso, até mais e obrigado pelos peixes!!!