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!!!