2.25.2013

MongoDB + Java.

В этой статье хотелось бы кратко описать работу MongoDB + Java и расмотреть основные операции CRUD. Прежде всего установим MongoDB для этого идем на официальный сайт и скачиваем дистрибутив, у меня ОС winXP 32 - к ней подходит дистрибутив mongodb-win32-i386-2.0.8, скачайте правильно дистрибутив, ибо под разные версии ОС (xp - mongodb-win32-i386-2.0.XXX, win7 - mongodb-win32-i386-2.2.XXX) идут разные дистрибутивы MongoDB. Под winXP мне пришлось скачать старую версию дистрибутива. Создайте папку на с:\data\db - там по умолчанию MongoDB будет хранить все файлы баз данных, распакуйте архив, перейдите в папку c:\mongodb-win32-i386-2.0.8\bin. Наберите в командной строчке start mongod.exe и запустите, после выполнения команды у вас в окне должна последней строчкой появиться такая надпись:
...
Tue Feb 12 21:17:51 [initandlisten] waiting for connections on port 27017
MongoDB запушена и ждет подключения к порту 27017. Запустим клиет наберем команду start mongo.exe --host localhost, по умолчанию при подключени к MongoDB не нужно указывать ни пользователя, ни пароля. У вас на экране должны появиться строчки:
MongoDB shell version: 2.0.8
connecting to: localhost:27017/test
>  
Подключаемся по умолчанию к БД test. В MongoDB основной рабочей лошадкой является коллекция которая содержит документы, документы представляют собой пары ключ-значения в формате JSON. По умолчанию базы данных и коллекции создаются при вставке первого документа. В MongoDB структуру документов не нужно определять заранее, как делается в реляционных СУБД во время разработки (create table, alter ...), мета-данные создаются во время выполнения команд вставки и изменения. Переключимся на БД vit и вставим документ в коллекцию persons - этот документ содержит одну пару ключ значение для хранения имени - {name:'vit'} введем данные:
MongoDB shell version: 2.0.8
connecting to: test
> use vit
switched to db vit
> db.persons.insert({name:'vit'})
выведем только что вставленый документ командой find:
> db.persons.find()
{ "_id" : ObjectId("511bdbf296970d429769f39e"), "name" : "vit" }
В распечатке консоли вы можете видеть новое поле _id, его можно считать первичным ключом документа. В любом документе MongoDB должно присутствовать поле _id которое гарантированно будет уникальным среди всех значений _id в данной коллекции. Если _id не задано в момент создания документа, то MongoDB генирирует его за вас. Вставим новый документ задав _id вручную:
> db.persons.insert({_id:ObjectId("012345678901234567890123"),telHome:515595})
выведем данные на экран:
> db.persons.find()
{ "_id" : ObjectId("511bdbf296970d429769f39e"), "name" : "vit" }
{ "_id" : ObjectId("012345678901234567890123"), "telHome" : 515595 }
Усложним немного наш пример введем понятие селектор запроса - условие поиска документа. Селектор представляет собой пару-ключ значение допустим найдем документ который содержит в поле name - значение vit:
> db.persons.find({name:"vit"})
{ "_id" : ObjectId("511bdbf296970d429769f39e"), "name" : "vit" }
>
не всегда нам нужно возвращать множество полей, ограничить их можно в виде возвращаемого набора полей:
> db.persons.find({},{name:1})
{ "_id" : ObjectId("511bdbf296970d429769f39e"), "name" : "vit" }
{ "_id" : ObjectId("012345678901234567890123") }
Этот запрос возвращает только два поля из документа - _id и name, _id - всегда включено по умолчанию. Иногда нам нужно исключить набор возвращаемых полей из набора:
> db.persons.find({},{name:0})
{ "_id" : ObjectId("511bdbf296970d429769f39e") }
{ "_id" : ObjectId("012345678901234567890123"), "telHome" : 515595 }
и так попробуем изменить документ
> db.persons.update({telHome:515595},{$set: {name:"Joy"}})
> db.persons.find()
{ "_id" : ObjectId("511bdbf296970d429769f39e"), "name" : "vit" }
{ "_id" : ObjectId("012345678901234567890123"), "name" : "Joy", "telHome" : 515595 }
и удалим документ
> db.persons.remove({name:"vit"})
> db.persons.find()
{ "_id" : ObjectId("012345678901234567890123"), "name" : "Joy", "telHome" : 515595 } 
еще последние две важные команды: выводит какие БД у нас есть
> show dbs
local   0.03125GB
test    0.03125GB
tutorial        0.0625GB
vit     0.03125GB
выводит имена коллекций в текущей БД
> show collections
persons
system.indexes
и еще одна важная команда - завершение работы сервера MongoDB, сначала нужно перейти в БД admin и потом вызвать команду db.shutdownServer():
> use admin
switched to db admin
> db.shutdownServer()
Fri Feb 15 22:38:04 DBClientCursor::init call() failed
Fri Feb 15 22:38:04 query failed : admin.$cmd { shutdown: 1.0 } to: 127.0.0.1
server should be down...
Fri Feb 15 22:38:04 trying reconnect to 127.0.0.1
Fri Feb 15 22:38:05 reconnect 127.0.0.1 failed couldn't connect to server 127
0.1
Fri Feb 15 22:38:05 Error: error doing query: unknown shell/collection.js:151
И так переходим к программированию на Java, для доступа к MongoDB нужно подключить "драйвер" в maven я делаю так:
        <dependency>
   <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>2.9.1</version>
   </dependency>
и так смотрим коментарии в коде:
package com.vit;

import com.mongodb.*;

import java.net.UnknownHostException;
import java.util.List;
import java.util.Set;

public class MainDb {
    private final String dbName = "vit";
    private final String collectionName = "persons";

    public static void main(String[] args) {
        new MainDb();
    }

    public MainDb() {
        Mongo mongo = null;
        try {
            //и так подключимся к MongoDB host port
            mongo = new Mongo("localhost", 27017);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        try {
            //получим все имена баз данных
            List databases = mongo.getDatabaseNames();
            System.out.println("Databases MongoDB:");
            for (String database : databases) System.out.println(database);
            //подключимся к БД vit
            DB db = mongo.getDB(dbName);
            System.out.println("\nCollections DB " + dbName + " MongoDB:");
            //запросим все коллекции в БД vit
            Set collections = db.getCollectionNames();
            for (String collection : collections) System.out.println(collection);
            DBCollection collection = db.getCollection(collectionName);
            //выведем все записи из коллекции
            DBCursor cursor;
            cursor = collection.find();
            PrintCursor(cursor);
            //вставка документа
            System.out.println("after Insert into MongoDB");
            BasicDBObject doc = new BasicDBObject();
            doc.put("name", "Vit");
            doc.put("telHome", 522318);
            collection.insert(doc);
            //выведем все записи из коллекции
            cursor = collection.find();
            PrintCursor(cursor);
            System.out.println("print Document with selector MongoDB");
            //выведем по условию поиска - "селектора" {"name","Joy"} из коллекции
            cursor = collection.find(
                    new BasicDBObject().append("name","Joy")
            , new BasicDBObject().append("name",1));
            PrintCursor(cursor);
            //изменение документа
            System.out.println("after update document MongoDB");
            doc = new BasicDBObject();
            doc.put("name", "Vit");
            doc.put("telHome", 522318);
            BasicDBObject doc1 = new BasicDBObject();
            doc1.put("$set",new BasicDBObject("name","Tom"));
            collection.update(doc, doc1, false, true);
            //выведем запись
            cursor = collection.find();
            PrintCursor(cursor);
            //удаление документа
            System.out.println("after delete document MongoDB");
            doc = new BasicDBObject();
            doc.put("name","Tom");
            doc.put("telHome", 522318);
            collection.remove(doc);
            //выведем все записи из коллекции
            cursor = collection.find();
            PrintCursor(cursor);
        } finally {
            // закрываем соединение с БД MongoDB
            if (mongo != null) mongo.close();
        }

    }

    /**
     * распечатываем документы возвращаемые курсором
     *
     * @param cursor
     */
    private void PrintCursor(DBCursor cursor) {
        DBObject doc;
        StringBuilder temp;
        while (cursor.hasNext()) {
            doc = cursor.next();
            temp = new StringBuilder();
            temp.append("{");
            for (String keyName : doc.keySet())
                temp.append(keyName + ":" + doc.get(keyName) + ", ");
            int i = temp.lastIndexOf(",");
            System.out.println(
                    temp.replace(i, i + ", ".length(), "}").toString());

        }
    }
}

Комментариев нет:

Отправить комментарий