среда, 22 ноября 2017 г.

Mongo Java driver

Рассмотрим простой пример приложения, которое обращается к Mongo. Содержимое оставим из предыдущих частей.
В зависимостях будет лишь драйвер для Mongo:
    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.5.0</version>
        </dependency>
    </dependencies>
Необходимо заметить, что я использую драйвер 3.х.х. В долшинстве примеров, что я нашел, использовался драйвер версии 2.х.х, в 3 версии большинство используемых в примерах объектов отмечены ка устаревшие (Deprecated).

Для начала посчитаем количество записей в коллекции и выведем ее:

MongoClient mongo = new MongoClient( "localhost" , 27017 );

MongoDatabase database = mongo.getDatabase("test");
FindIterable<Document> unicorns = database.getCollection("employees").find();
long employeesCount = database.getCollection("employees").count();

System.out.println("count = " + employeesCount);
printD(id);

Функция для вывода коллекции:
private static void printD(Iterable<Document> objects){
 objects.forEach(document -> document.forEach((key, value) -> System.out.println(key + " = " + value)));
}
Создадим  новую запись:
        Document document = new Document();
        document.put("name", "Martin");
        document.put("hired", new Date());
        document.put("skills", "[smart, responsible]");
        document.put("age", 22);
        document.put("gender", "m");
        document.put("salary", 2468);
        database.getCollection("employees").insertOne(document);

        employeesCount = database.getCollection("employees").count();
        System.out.println("count = " + employeesCount);
Количество записей увеличилось на 1.  Попробуем обновить, созданную запись:
 Document find = new Document();
        find.put("name", "Martin");
        FindIterable<Document> beforeUpdate = database.getCollection("employees").find(find);
        printD(beforeUpdate);

        System.out.println("update:");

        Document update = new Document();
        Document set = new Document();
        update.put("salary", 2479);
        set.put("$set", update);
        database.getCollection("employees").updateMany(find, set);
        FindIterable<Document> updated = database.getCollection("employees").find(find);
        printD(updated);
Поиск записи по ИД. Внимание, я использую свой ИД, необходимо использовать именно ваш, сегенерированный ид:
 System.out.println("find by id");
        Document findById = new Document();
        findById.put("_id", new ObjectId("5a1525ea0f6ce550de6fc392"));
        FindIterable<Document> id = database.getCollection("employees").find(findById);
        printD(id);
Удалим созданный объект:
        database.getCollection("employees").deleteMany(find);
        employeesCount = database.getCollection("employees").count();
        System.out.println("count = " + employeesCount);

Количество записей уменьшилось на 1.

Полностью код приведен ниже:
package com;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.types.ObjectId;

import java.util.Date;
public class Application {

    public static void main(String[] args) {

        MongoClient mongo = new MongoClient( "localhost" , 27017 );

        MongoDatabase database = mongo.getDatabase("test");
        FindIterable<Document> unicorns = database.getCollection("employees").find();
        long employeesCount = database.getCollection("employees").count();
        System.out.println("count = " + employeesCount);
        printD(unicorns);

        Document document = new Document();
        document.put("name", "Martin");
        document.put("hired", new Date());
        document.put("skills", "[smart, responsible]");
        document.put("age", 22);
        document.put("gender", "m");
        document.put("salary", 2468);
        database.getCollection("employees").insertOne(document);

        employeesCount = database.getCollection("employees").count();
        System.out.println("count = " + employeesCount);


        Document find = new Document();
        find.put("name", "Martin");
        FindIterable<Document> beforeUpdate = database.getCollection("employees").find(find);
        printD(beforeUpdate);

        System.out.println("update:");

        Document update = new Document();
        Document set = new Document();
        update.put("salary", 2479);
        set.put("$set", update);
        database.getCollection("employees").updateMany(find, set);
        FindIterable<Document> updated = database.getCollection("employees").find(find);
        printD(updated);


        System.out.println("find by id");
        Document findById = new Document();
        findById.put("_id", new ObjectId("5a1525ea0f6ce550de6fc392"));
        FindIterable<Document> id = database.getCollection("employees").find(findById);
        printD(id);

        database.getCollection("employees").deleteMany(find);
        employeesCount = database.getCollection("employees").count();
        System.out.println("count = " + employeesCount);
      
    }

    private static void printD(Iterable<Document> objects){
        objects.forEach(document -> document.forEach((key, value) -> System.out.println(key + " = " + value)));
    }
}

среда, 8 ноября 2017 г.

MongoDb основные операции. Часть 3

Выбор полей

Команда find(), так же может принимать второй необязательный парметр, в котором перечисляются поля, которые будут в выборке. Так же необходимо заметить, что поле _id выбирается по умолчанию, если мы хотим его исключить - нужно это указать. Попробуем выбрать все имена:

db.employees.find({},{name:1, _id:0});
db.employees.find({},{name:1});
Второй вариант вернется так же поле _id.

Сортировка

Чтобы отсортировать результат к курсору find() добавляется sort, с очень похожими входными параметрами, необходимо указать поле и направление сортировки 1 - по возрастанию, -1 - по убыванию:

db.employees.find({},{name:1, _id:0}).sort({name:1});
Необходимо упомянуть, что если попытатьс отсортировать большой объем данных без индекса - мы получим ошибку.

Разбиение на страницы

Разбиение на страницы выполняется с помощью limit и skip, так же их можно использовать, чтобы избежать проблем при сортировке по полям, не содержащим индексы. Получим 4 и 5 имена:
db.employees.find({}, {name:1, _id:0}).sort({name:1}).limit(2).skip(3);

Подсчет записей

Консоль mongoDb позволяет выполнять count над коллекцией, некоторые драйвера не позволяют делать этого, в таком случае, count необходимо выполнить после find():

db.employees.find({}, {name:1, _id:0}.count();

воскресенье, 5 ноября 2017 г.

MongoDb основные операции. Часть 2

Обновление данных

Чтобы обновить данные воспользуемся, командой update, например добавил з/п для Бориса:
db.employees.update({name:'Boris'}, {salary:7000});
После обновления попробуем получить запись:
db.employees.find({name:'Boris'});
Запись не найдена, т.к. обычный update полностью заменяет документ. Чтобы обновлять только нужные поля необходимо воспользоваться модификатором $set:

db.employees.update({salary:7000}, {$set:{name: 'Boris', hired: new Date(2002,2,13,7,47), skills: ['smart','happy'], age: 60, gender: 'm'}});
Кроме модификатора $set есть другие, например, $inc увеличивает на заданную величину число или $push добавлет элемент в массив:

db.employees.update({name:'Boris'}, {$inc:{salary:200}, $push:{skills:'responsible'}});

Вставка/Обновление

Чтобы выполнить обновление или вствку записи при ее отсутствии необходимо передать третий параметр-флаг, true, например, на склад завезли канцелярские товары, а именно ручки:
db.storage.update({stationery:'pen'}, {$inc:{count: 200}},true)
При первом выполнении произойдет создание документы, а при втором - увеличение счетчика на 200 единиц.

Множественное обновление

Команда update обновляет только первую найденную запись, чтобы обновить все записи, удовлетворяющие заданному условию, необходимо установить четвертый параметр в true. Так же необходимо заметить, что множественное обновление работает только с модификатором, чтобы не произошло замены документов, только обновление полей:

db.employees.update({}, {$set:{isIll:false}}, false, true);

пятница, 3 ноября 2017 г.

MongoDb основные операции

1. Скачивание и запуск

Прежде чем рассматривать основные операции в MongoDb - скачаем ее с офф сайта. Разархивируем скачанный файл и перейдем в папку bin. Больше всего нас интересуют файлы: mongod - сервер и mondo - клиентская консоль. В папке bin, создадим конфигурационный файл mongo.config. В него добавим: dbpath=путь_куда_создать_базу_данных. Теперь, запустим mongod, в консоли выполним: mongod.exe --config mongo.config. Для проверки запустим  файл mongo и выполним db.version(). В результате получим версию своей MongoDb.

2. Выбор БД и ее наполнение

Запустим консоль -  mongo.  Она работает на JavaScript. Существует несколько глобальных команд, например exit или help. Большинство команд выполняются применительно к каому-либо объекту, например, выполним db.stats(), получим информацию о текущей базе данных:
Текущая база - test, сменим ее, выполнив: use learn:
При создании первой коллекции произойдет и создание БД. Создим несколько коллекций:
db.employees.insert({name: 'Boris', hired: new Date(2002,2,13,7,47), skills: ['smart','happy'], age: 60, gender: 'm', salary: 6300}); 
db.employees.insert({name: 'Aurora', hired: new Date(2011, 0, 24, 13, 0), skills: ['smart', 'responsible'], age: 45, gender: 'f', salary: 4300}); 
db.employees.insert({name: 'Tom', hired: new Date(2003, 1, 9, 22, 10), skills: ['energetic', 'enthusiast'], age: 34, gender: 'm', salary: 18200}); 
db.employees.insert({name: 'Rod', hired: new Date(2009, 7, 18, 18, 44), skills: ['serious'], age: 57, gender: 'm', salary: 9900}); 
db.employees.insert({name: 'Solnara', hired: new Date(2005, 6, 4, 2, 1), skills:['serious', 'smart', 'serious'], age:55, gender:'f', salary:8000}); 
db.employees.insert({name:'Kenny', hired: new Date(2007, 6, 1, 10, 42), skills: ['responsible', 'independent'], age: 39, gender: 'm', salary: 3900}); 
db.employees.insert({name: 'Ralf', hired: new Date(2005, 4, 3, 0, 57), skills: ['serious', 'independent'], age: 21, gender: 'm', salary: 200}); 
db.employees.insert({name: 'Leia', hired: new Date(2001, 9, 8, 14, 53), skills: ['serious', 'easily trained'], age: 40, gender: 'f', salary: 3300}); 
db.employees.insert({name: 'Bill', hired: new Date(2007, 2, 1, 5, 3), skills: ['serious', 'easily trained'], age: 35, gender: 'm', salary: 5400}); 
db.employees.insert({name: 'Nimue', hired: new Date(2009, 11, 20, 16, 15), skills: ['responsible', 'smart'], age: 54, gender: 'f'}); 
db.employees.insert({name: 'Max', hired: new Date(2006, 6, 18, 18, 18), skills: ['responsible', 'easily trained'], age: 44, gender: 'm', salary: 16500}); 
 Каждая команда вставляет в коллекцию employees перевадаваемый аргумент, который представляет из себя обычный JSON. Выполним команду поиска: db.employees.find(). В результате получим все введенные данные. У них повилось поле _id. У каждой записи должно быть уникальное поле, можно его генерировать самому или позволить это делать MongoDb. Поле _id, по умолчанию индексируется.
Когда у нас есть данные, можно начать осваивать выборки. Поиск происходит, так же как и вставка, ипользуя связку: {поле:значение}, так де есть операторы: $lt, $lte, $gt, $gte и $ne, обозначающие "меньше", "меньше или равно", "больше", "больше или равно", и "не равно". Попробуем выбрать всех людей, кто младше 30:
db.employees.find({"age":{$lte:30}})
Теперь попробуем выбрать тех, что младже 30 или у кого з/п выше 10000:
db.employees.find({$or:[{"age":{$lte:30}},{"salary":{$gte:10000}}]})
Если хотим выбрать только серьезных работников:
db.employees.find({"skills":'serious'})