Java MongoDB с чего начать?

В данном уроке я бы хотел показать как работать с MongoDB и что вам для этого нужно.

Как установить MongoDB вы найдете тут ‘Как установить и настроить MongoDB на Windows 7?‘.

Шаг 0

Ну первое что стоит сделать это создать новый Maven project и добавить в pom.xml зависимость:

<dependency>
     <groupId>org.mongodb</groupId>
     <artifactId>mongo-java-driver</artifactId>
      <version>2.11.2</version>
</dependency>

После этого мы можем приступать к работе с MongoDB базой.

Шаг 1

Теперь предлагаю поставить UI клиент для MongoDB, советую этот Robomongo.

После того как вы поставите клиент вам нужно создать нового пользователя в MongoDB для уже существующей БД — ‘admin’.

Для этого в cmd или терминале коннектимся в MongoDB и добавляем нового пользователя для схемы ‘admin’.

mongo.exe connect
use admin
db.addUser('root', 'root');

У вас должно получится следующее:

Пользователя мы создали, имя схемы в БД знаем это — admin, можно переходить к коннекту.

Шаг 2 — Подключение к MongoDB

Теперь давайте подключимся к БД.

Создаем класс WorkWithMongo.java и в конструкторе этого класса создаем подключение к БД:

// это клиент который обеспечит подключение к БД
private MongoClient mongoClient;

// В нашем случае, этот класс дает 
// возможность аутентифицироваться в MongoDB
private DB db;

// тут мы будем хранить состояние подключения к БД
private boolean authenticate;

// И класс который обеспечит возможность работать 
// с коллекциями / таблицами MongoDB
private DBCollection table;

public WorkWithMongo(Properties prop) {
    try {
        // Создаем подключение
        mongoClient = new MongoClient( prop.getProperty("host"), Integer.valueOf(prop.getProperty("port")) );

        // Выбираем БД для дальнейшей работы
        db = mongoClient.getDB(prop.getProperty("dbname"));

        // Входим под созданным логином и паролем
        authenticate = db.authenticate(prop.getProperty("login"), prop.getProperty("password").toCharArray());

        // Выбираем коллекцию/таблицу для дальнейшей работы
        table = db.getCollection(prop.getProperty("table"));
    } catch (UnknownHostException e) {
        // Если возникли проблемы при подключении сообщаем об этом
        System.err.println("Don't connect!");
    }
}

Properties prop — это параметры которые будут передаваться при создании new WorkWithMongo(props); это мы рассмотрим чуть позже.

Шаг 3 — Создадим сущность

Создадим сущность и назовем её User.java:

public class User {

    private String id;
    private String login;

    public User(String login) {
        this.login = login;
    }

    public User() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", login='" + login + '\'' +
                '}';
    }
}

Шаг 4 — Записать в MongoDB

Для того чтобы добавить запись в коллекцию нам нужно создать метод add(User user) в классе WorkWithMongo:

public void add(User user){
    BasicDBObject document = new BasicDBObject();

    // указываем поле с объекта User
    // это поле будет записываться в коллекцию/таблицу
    document.put("login", user.getLogin());

    // записываем данные в коллекцию/таблицу
    table.insert(document);
}

Шаг 5 — Получение записи с коллекции

public User getByLogin(String login){
    BasicDBObject query = new BasicDBObject();
    
    // задаем поле и значение поля по которому будем искать
    query.put("login", login);

    // осуществляем поиск
    DBObject result = table.findOne(query);
   
    // Заполняем сущность полученными данными с коллекции
    User user = new User();
    user.setLogin(String.valueOf(result.get("login")));
    user.setId(String.valueOf(result.get("_id")));
 
    // возвращаем полученного пользователя
    return user;
}

Получать мы будем по логину пользователя.

Шаг 6 — Обновление данных

// login - это старый логин пользователя
// newLogin - это новый логин который мы хотим задать
public void updateByLogin(String login, String newLogin){
    BasicDBObject newData = new BasicDBObject();

    // задаем новый логин
    newData.put("login", newLogin);

    // указываем обновляемое поле и текущее его значение
    BasicDBObject searchQuery = new BasicDBObject().append("login", login);

    // обновляем запись
    table.update(searchQuery, newData);
}

В данном примере мы обновляем только login, но можно обновлять любые поля коллекции таким способом.

Шаг 7 — Удаление данных

Удалять мы также будем по логину пользователя:

public void deleteByLogin(String login){
    BasicDBObject query = new BasicDBObject();

    // указываем какую запись будем удалять с коллекции 
    // задав поле и его текущее значение
    query.put("login", login);

    // удаляем запись с коллекции/таблицы
    table.remove(query);
}

Шаг 8

Теперь проверим все это дело с помощью тестов.

Для тестирования я использовал Framework TestNG информацию о нем вы можете почитать в уроке ‘Тестирование с помощью TestNG в Java‘.

Сразу покажу вам полный листинг тестового файла который называется WorkWithMongoTest.java:

import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.util.Properties;

public class WorkWithMongoTest {

    WorkWithMongo mongo;

    @BeforeMethod
    public void setUp() throws Exception {
        Properties prop = new Properties();
        prop.setProperty("host", "localhost");
        prop.setProperty("port", "27017");
        prop.setProperty("dbname", "admin");
        prop.setProperty("login", "root");
        prop.setProperty("password", "root");
        prop.setProperty("table", "users");

        mongo = new WorkWithMongo(prop);
    }

    @AfterMethod
    public void tearDown() throws Exception {
        mongo.close();
    }

    @Test
    public void testConnection() throws Exception {
        boolean authenticate = mongo.isAuthenticate();
        Assert.assertEquals(true, authenticate);
    }

    @Test
    public void testAddUser() throws Exception {
        mongo.add(new User("test"));
    }

    @Test
    public void testGet() throws Exception {
        User user = mongo.getByLogin("test");
        System.out.println(user);
    }

    @Test
    public void testDelete() throws Exception {
        mongo.deleteByLogin("test");
    }

    @Test
    public void testUpdate() throws Exception {
        mongo.updateByLogin("test", "DevColibri");
    }

}

p.s. На этом все, задавайте вопросы в комментариях если что-то не понятно или предлагайте свои способы решение.

Урок создан: 02 июля 2013 | Просмотров: 13508 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

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

  • 16 ноября 2013 в 21:57

    Денис

    Большое спасибо. Только вопрос: как получить не весь объект, а только некоторые поля? Чтобы с бд возвращались только нужные поля, а не объект целяком.

    • 17 ноября 2013 в 15:23

      Александр Барчук

      Думаю тут стоит использовать SQL вот дока http://docs.mongodb.org/manual/reference/sql-comparison/

      • 17 ноября 2013 в 18:25

        Денис

        Спасибо, я решил нашел вот такое решение
        Map map = new HashMap();
        map.put(«firstName», 1);
        map.put(«lastName», 1);
        map.put(«email», 1);

        BasicDBObject query = new BasicDBObject();
        query.put(«_id», new ObjectId(id));

        BasicDBObject fields = new BasicDBObject(map);
        DBCollection collection = db.getCollection(«User»);
        if (collection != null) {
        DBObject object = collection.findOne(query, fields);

        • 20 апреля 2016 в 17:55

          DX

          Кстати, вместо
          Map map = new HashMap();
          map.put(«firstName», 1);
          map.put(«lastName», 1);
          map.put(«email», 1);

          можно использовать
          Map map = new HashMap().append(«firstName», 1).append(«lastName», 1).append(«email», 1);

          Бывает удобно.

      • 26 августа 2016 в 16:48

        Иван

        А вы можете в начале стать дописать что если пользоваться MongoDb 3.0+, то в ней заменили db.addUser на db.createUser
        и соответственно нужен уже такой запрос:
        db.createUser( { user: «root», pwd: «root», roles: [ «userAdminAnyDatabase», «dbAdminAnyDatabase», «readWriteAnyDatabase»] } )

  • 13 мая 2017 в 22:15

    Nurzat

    В этой программе при обновлении перезаписывается весь документ. Мне необходимо обновить в документе только одно поле, остальные поля оставить. Это выглядит примерно так: db.users.update({name : «Eugene», age: 29}, {$set: {age : 30}}). Помогите пожалуйста, как это реализовать в java.

  • 03 августа 2017 в 16:55

    P

    Так что там с Properties?