25 ноября 2011 г.

Java MongoDB Tutorial

Сначала я хотел написать заметку, в которой бы вкраце излогались основные моменты работы с MongoDB, но потом понял, что официальный Java QuickTour уже удовлетворяет всем моим требованиям к конспекту по технологии, так что я решил просто сделать перевод данного руководства. Итак, начнем.

Введение
Данная статья является кратким обзором работы с драйвером MongoDB Java.
Более подробную информацию о Java API вы можете найти в онлайн документации драйвера Java.


Краткий обзор
Использование драйвера Java очень просто. Во-первых, не забудьте включить mongo.jar в ваш classpath. Ниже приведены фрагменты кода из examples/QuickTour.java - одного из примеров кода, который вы можете найти в драйвере.


Создание подключения
Для подключения к MongoDB, вы должны, как минимум, знать имя базы, к которой вы подключаетесь. Причем база данных не обязательно должна существовать - если её нет, то MongoDB автоматически создаст её.


Дополнительно, вы можете указать адрес сервера и порт. Следующий пример показывает три способа подключения к базе данных MyDB на локальной машине:
import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;

Mongo m = new Mongo();
// or
Mongo m = new Mongo( "localhost" );
// or
Mongo m = new Mongo( "localhost" , 27017 );

DB db = m.getDB( "mydb" );
К этому моменту, объект db является подключением к MongoDB серверу для указанной базы данных. С его помощью вы можете выполнять последующие операции.


Примечание: Объект Mongo фактически проедставляет собой пул соединений с базой данных: вам не нужно создавать более одного объекта класса Mongo даже в работе с несколькими потоками. См. страницу параллелизма в документации для получения дополнительной информации.


Класс Mogno является потокобезопасным и делится между потоками. Обычно вы создаете один экземпляр для кластера базы данных и используете его во всем приложении. Если пока каким-либо причинам вы решите создать множество экземпляров Mongo учтите что:
  • все ограничения на использование ресурсов (максимум подключений и т.д.) относятся ко всем экземплярам Mongo;
  • при уничтожения экземпляра вы используете mongo.close() для очистки ресурсов;


Аутентификация (опционально)
MongoDB может быть заущена в безопасном режиме, когда доступ к базе контролируется через аутентификацию (логин и пароль). В этом режиме, любое клиентское приложение должно предоставить логин и пароль перед тем, как выполнять любую операцию. При использовании драйвера Java вы просто делается следующее с подключенным объектом mongo:
boolean auth = db.authenticate(myUserName, myPassword);
Если имя и пароль правильные auth будет равно true, иначе false. Вы можете посмотреть лог MongoDB для дополнительной информации.

Большинство пользователей запускают MongoDB без аутентификации в доверенной среде (trusted environments).

Получение списка коллекций
Каждая база данных содержит нуль или больше коллекций. Вы можете получить их список из БД (и напечатать их список):
Set<String> colls = db.getCollectionNames();
for (String s : colls) {
    System.out.println(s);
}
Предположим, что там содержится две коллекции - name и address. Тогда вы бы увидели следующее:
name
address
Получение коллекции
Чтобы использовать коллекцию, просто укажите имя коллекции в методе getCollection(String collectionName):
DBCollection coll = db.getCollection("testCollection")
После того, как вы создали объект коллекии вы можете делать разные вещи, например добавлять данные, делать запросы и т.д.

Добавление данных
Используя объект коллекции вы можете добавлять в неё данные. Например, давайте сделаем небольшую запись, которая в представлении JSON будет иметь вид:
{
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
   "info" : {
               x : 203,
               y : 102
             }
}
Обратите внимание на встроеный внутренний объект. Чтобы создать данную запись нужно воспользоваться классом BasicDBObject, а затем просто добавить его в коллекцию используя метод insert():
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
BasicDBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);
doc.put("info", info);
coll.insert(doc);
Поиск первого элемента коллекции используя findOne()
Чтобы убедиться, что на предыдущем шаге объект был вставлен в базу данных, мы можем использовать простую операцию findOne() для получения первого объекта в коллекции. Этот метод возвращает один объект (в отличии от DBCursor, который возвращает операция find()), и используется в тех случаях, когда существует только один объект или вы заинтересованы только в первом. Вам не придеться иметь дело с курсором:
DBObject myDoc = coll.findOne();
System.out.println(myDoc);
И вы увидите:
{ "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
Примечание: элемент _id был добавлен к объекту автоматически. MongoDB резервирует имена элементов, начинающихся с "_"/"$" для внутреннего использования.

Добавление нескольких объектов
Для того, чтобы делать более интересные вещи с запросами, давайте добавим в коллекцию несколько простых объектов. Эти объекты будут иметь вид:
{
   "i" : value
}
и мы можем сделать это очень эффективно в цикле:
for (int i=0; i < 100; i++) {
    coll.insert(new BasicDBObject().append("i", i));
}
Обратите внимание, что мы можем вставлять разные объекты в одну и ту же коллекцию. Это то, что мы подразумеваем, когда говорит, что MongoDB является "schema-free".

Подсчет объектов в коллекции
Теперь, когда мы вставили 101 объект (100 мы добавили в цикле, плюс первый), мы можем убедиться, что они все находятся в коллекции используя метод getCount():
System.out.println(coll.getCount());
Он должен напечатать 101.

Использование курсора для доступа ко всем элементам
Для того чтобы получить все объекты коллекции мы будем использовать метод find(). Метод возвращает объект DBCursor, который позволяет перемещается по элементам коллекции, удовлетворящим нашему критерию. Получить все элементы коллекции и вывести их на экран мы можем так:
DBCursor cur = coll.find();
while(cur.hasNext()) {
    System.out.println(cur.next());
}
будут напечатаны все 101 элемент коллекции.

Получение одного объекта используя объект-запрос
Мы можем сделать объект-запрос и передать его методу find() чтобы получить подмножество объектов нашей коллекции. К примеру, если мы хотим получить объект, значением поля "i" которого является 71, мы можем сделать следующее:
BasicDBObject query = new BasicDBObject();
query.put("i", 71);
cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next());
}
этот код должен вывести только один объект:
{ "_id" : "49903677516250c1008d624e" , "i" : 71 }
Часто в документации MongoDB вы можете видеть примеры с использованием оператора $, например:
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
В драйвере Java они представлены, как обычные ключи String, используя встроенные DBObjects:
BasicDBObject query = new BasicDBObject();
query.put("j", new BasicDBObject("$ne", 3));
query.put("k", new BasicDBObject("$gt", 10));
cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next());
}
Получение множества объектов исползуя запросы
Мы можем получить множество объектов коллекции используя запросы. Например, если мы хотим получить все объекты, где "i" > 50, то должны написать:
query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 50));  // e.g. find all where i > 50
cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next());
}
Получить объекты, у которых 20 < i <= 30 можно так:
query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));  // i.e.   20 < i <= 30
cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next());
}

Создание индекса
MongoDB поддерживает индексы и их очень легко добавить в коллекцию. Чтобы создать индекс просто укажите какое поле должно быть индексом и укажите будет ли индекс восходящим(1) или убывающим(-1). Следующий пример назначает индексом поле "i":
coll.createIndex(new BasicDBObject("i", 1));

Получение списка индексов коллекции
Вы можете получить все индексы коллекции следующим образом:
List<dbobject> list = coll.getIndexInfo();
for (DBObject o : list) {
    System.out.println(o);
}
И вы увидите что-то вроде:
{ "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} }
Краткий обзор административных функций
Вы можете получить список баз данных:
Mongo m = new Mongo();
for (String s : m.getDatabaseNames()) {
    System.out.println(s);
}
Удаление таблицы
Вы можете удалить таблицы используя объект Mongo:
m.dropDatabase("my_new_db");

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

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

Примечание. Отправлять комментарии могут только участники этого блога.