Перейти к содержанию

MongoDB

MongoDB - документоориентированная (NoSQL) СУБД, хранящая все данные в виде объектов JSON. Отличительная особенность таких баз данных - отсутствие реляционных связей и заранее описанных схем таблиц.

Прежде, чем начать, необходимо установить саму MongoDB. Для этого зайдите на официальный сайт MongoDB и следуйте всем указанным на нем инструкциям по установке.

Для работы с MongoDB и Node.js имеется специальный официальный драйвер, который устанавливается через npm.

1
npm install mongodb --save

Подключение

Теперь подключимся к базе.

connection.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const mongo = require('mongodb').MongoClient;

mongo.connect(
    'mongodb://localhost:27017',
    (err, client) => {
        if (err) {
            console.log('Connection error: ', err);
            throw err;
        }

        console.log('Connected');

        client.close();
    }
);

Подключение осуществляется с помощью метода connect() экземпляра MongoClient, который принимает URL, по которому доступна MongoDB (по умолчанию http://127.0.0.1:27017), и callback-функцию, которой передается два параметра:

  • ошибка подключения (null, если подключение прошло успешно);
  • экземпляр объекта подключения к MongoDB, через API которого создаются новые БД и осуществляется доступ к уже существующим.

После окончания работы с сервером MongoDB не забывайте закрывать соединение с сервером базы данных.

1
client.close();

Создание базы данных

Для создания/подключения к базе данных используется метод db() экземпляра объекта подключения, который принимает название БД и возвращает объект для выполнения . Если указанная база не существует, то она будет создана.

1
const db = client.db('db_name');

Физически база данных начинает свое существование только после создания в ней хотя бы одной коллекции (тоже самое, что и таблица в SQL).

Коллекции

Коллекции создаются вызовом метода createCollection(), принимающего название коллекции и callback-функцию с ошибкой и результатом в качестве параметров.

1
2
const db = client.db('db_name');
const users = db.createCollection('users');

Для удаления коллекции используйте применительно к ней метод drop(), который в качестве аргумента принимает callback-функцию с двумя параметрами:

  • ошибка (если удаление прошло успешно - null);
  • объект с успешным результатом.
1
2
3
4
5
6
users.drop((err, result) => {
    if (err) {
        console.log('Unable drop collection: ', err);
        throw err;
    }
});

В отличии от базы данных создание и подключение к коллекции осуществляется двумя разными методами.

Создание записи

Теперь создадим в коллекции users первую запись.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
users.insertOne(
    {
        id: 1,
        login: 'login1',
        name: 'name1',
        gender: 'male',
    },
    (err, result) => {
        if (err) {
            console.log('Unable insert user: ', err);
            throw err;
        }
    }
);

Чтобы вставить сразу несколько записей имеется метод insertMany().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
users.insertMany(
    [
        {
            id: 2,
            login: 'login2',
            name: 'name2',
            gender: 'male',
        },
        {
            id: 3,
            login: 'login3',
            name: 'name3',
            gender: 'female',
        },
    ],
    (err, result) => {
        if (err) {
            console.log('Unable insert user: ', err);
            throw err;
        }
    }
);

Получение записи

Для получения всех записей в коллекции используйте метод find() экземпляра коллекции.

1
users.find();

Методу find() в качестве параметра можно передать объект, выполняющий роль фильтра для извлекаемых записей. Например, в следующем примере возвращаются все записи, у которых поле gender равно male.

1
users.find({ gender: 'male' });

Чтобы получить только первую запись выборки, используйте метод findOne().

1
2
users.findOne();
users.findOne({ gender: 'male' });

Для получения n-первых записей имеется метод limit(), принимающий количество возвращаемых записей.

1
users.find().limit(5);

Сортировка полученного результата осуществляется с помощью метода sort(), который принимает объект, в котором ключ - сортирующее поле, а значение - порядок сортировки (1 - по возрастанию, а -1 - по убыванию).

1
users.find().sort(1);

Ограничение по выборке и сортировку можно задать в объекте, передаваемом вторым необязательным параметром.

1
2
3
4
5
6
7
users.find(
    {},
    {
        limit: 5,
        sort: 1,
    }
);

С полным списком параметров можно ознакомиться в официальной документации.

Объединение коллекций

Ранее уже упоминалось, что в MongoDB отсутствуют реляционность, тем не менее в ней возможно объединений коллекций по принципу LEFT JOIN в SQL с помощью метода aggregate().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
users
    .aggregate([
        {
            $lookup: {
                from: 'rooms',
                localField: 'room_id',
                foreignField: 'id',
                as: 'room_details',
            },
        },
    ])
    .toArray((err, res) => {
        if (err) {
            console.log('Aggregate error: ', err);
            throw err;
        }

        console.log(res);
    });

Метод aggregate() принимает массив с описанием объединений с другими коллекциями. Объединение определяется объектом с ключом $lookup, значением для которого служит объект конфигурации со следующими свойствами:

  • from - название коллекции, с которой происходит слияние;
  • localField - наименование поля, по которому будет осуществляться объединение с внешней коллекцией;
  • foreignField - наименование объединяющего поля из внешней коллекции;
  • as - название поля в текущей коллекции, которое будет содержать данные, полученные в результате слияния.

Обновление записи

Обновление записи происходит с помощью метода updateOne(), который принимает условие для записей, которые необходимо обновить, и объект со свойством $set, в значении которого указываются, какие именно поля нужно изменить.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
users.updateOne(
    { id: 1 },
    { $set: { gender: 'female' } },
    (err, result) => {
        if (err) {
            console.log('Unable update user: ', err);
            throw err;
        }
    }
);

Удаление записи

За удаление записей отвечают методы deleteOne() и deleteMany().

1
2
3
4
5
6
users.deleteOne({ id: 3 }, (err, result) => {
    if (err) {
        console.log('Unable delete user: ', err);
        throw err;
    }
});

Более подробную информацию о возможностях драйвера для Node.js MongoDB можно получить на официальном сайте.

Комментарии