MongoDB Node.JS Driver Взаимодействие приложений Node.js и MongoDB


Драйвер MongoDB NodeJS

Взаимодействие MongoDB с приложениями, созданными на JS в среде Node.js

Автор: Владимир Ткаченко

Источник: Обучение в интернет

Продолжение статьи СУБД MongoDB - Базы данных NoSQL. Рассмотрим технологию подключения приложений Node.js к базам данных MongoDB и взаимодействие СУБД MongoDB с приложениями, созданными на JS в среде Node.js. Для организации работы между MongoDB и приложением, созданным на JS в среде Node.js, необходимо установить драйвер MongoDB NodeJS. Из двух популярных драйверов (официальный драйвер Node.js - mongodb и официальный ODM MongoDb в Node.js - mongoose) сначала рассмотрим официальный драйвер MongoDB Node.js. Драйвер mongodb - это низкоуровневая библиотека, которая предоставляет возможность непосредственно обращаться к базе MongoDB.

Исследуем как этот драйвер можно использовать в Node.js для манипулирования базами данных DBMS MongoDB. Для этого создадим новый проект (директорию), например, WebSMS, в которой будут помещены Web приложения с помощью которых будут выполняться операции driver CRUD, т.е. операции, выполняемые для создания, чтения, обновления и удаления документов. Проект WebSMS с базой "smsdb" и коллекцией "employees", в которую входят документы, включающие в себя набор текстовых полей в формате JSON, типа {name: "Іван Іванченко", phone_numer: "+380509999999"}, предназначен для рассылки SMS сообщений через интернет.

В директории WebSMS создадим файл конфигурации package.json, который содержит метаданные для веб-приложения:
{
"name": "WebSMS",
"version": "1.0.0",
"description": "Project WebSMS",
"dependencies": {
}
}

Этот файл конфигурации необходим для развертывания веб-приложения, созданного в файловой системе компьютера, на хостинге, например, на Heroku.

В каталоге WebSMS установим драйвер mongodb:
npm install mongodb --save

Устанка драйвера mongodb
Рис. 1. Установка драйвера mongodb

В результате выполнения команды «npm» будет загружен драйвер MongoDB Node.js и будет добавлена запись ("mongodb": "^3.1.8") в файл "package.json"

Далее в каталоге WebSMS установим модуль express, т.е. Node.js framework (веб-фреймворк), на основе которого будем создавать различные приложения app.js:
npm install express --save

Фрагмент установки фреймворка express в Node.js
Рис. 2. Фрагмент установки фреймворка express в Node.js

После осуществления загрузки фреймворка express (скриншот на рис. 2), будет добавлена запись ("express": "^4.16.4") в файл "package.json".

В командной строке запустим сервер баз данных MongoDB, который находится в папке bin и называется mongod:
C:\mongodb>bin\mongod

Запуск сервера баз данных - mongod
Рис. 3. Скриншот, в котором отображается процесс запуска сервера баз данных

Для подключения приложений, созданных на языке программирования JS на основе фреймворка express в среде Node.js, к базам данных MongoDB и управления базами данных с помощью драйвера MongoDB NodeJS создадим файлы app.js, с помощью которых апробируем выполнение основных операций CRUD (insert, read, update, delete).

Сначала можно создать базу данных, MongoDB Create Database, затем создать коллекцию MongoDB Create Collection, а потом добавить записи в документы коллекции. Чтобы создать базу данных в MongoDB необходимо с помощью функции require() подключить модуль mongodb, и создать клиента MongoClient, через который осуществляется взаимодействие приложения с базой данных, затем указать URL-адрес соединения с именем базы данных:
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/smsdb";

Но, если учесть, что БД и коллекция могут быть созданы сервером баз данных автоматически при первом обращении к ним, можно объединить операции создания БД, коллекции и добавления записей в документы. Для выполнения записи документов (данных) в БД MongoDB в коде файла приложения app.js можно использовать различные методы. Если нужно добавить одну запись, то применяется метод insertOne(), при вставки набора записей можно использовать метод insertMany().

Чтобы в процессе выполнения приложения сервер не выдавал предупреждения типа: "Deprecation Warning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect", учтем запись { useNewUrlParser: true } в аргументах функции connect().

Теперь создадим приложение app_1-sms.js, в коде которого подключимся к БД - smsdb, добавим к коллекции - employees документ с записью {name: "Роман Демченко", phone_numer: "+380505555555"}, применив метод insertOne():


// Подключаем модуль mongodb и создаем mongoClient 
const mongoClient = require("mongodb").MongoClient;
// Объявляем URL-адрес подключения к БД
const url = "mongodb://localhost:27017/smsdb";
// Для подключения к серверу mongodb применяем метод connect()
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db){
	// После подключения к БД обращаемся к коллекции "employees"
	const collection = db.collection("employees");
	// Объявляем переменную let с областью видимости в блоке {...} после ее объявления
	let employee = {name: "Роман Демченко", phone_numer: "+380505555555"};
	// для вставки записи (данных) применяем метод insertOne()
	collection.insertOne(employee, function(err, result){
		// вывести ошибку подключения   
		if(err){ 
			return console.log(err);
				}
		// при успешном подключении к бд вывести итоговый документ с добавленными полями _id
		console.log(result.ops);
			// закрыть соединение с базой данных      
			db.close();
	});
})				

Теперь запустим это приложение app_1-sms.js на выполнение во второй командной строке, для этого перейдем в каталог WebSMS, в котором оно помещено:
C:\WebSMS>node app_1-sms.js

Процесс выполнения приложения app_1-sms.js
Рис. 4. Скриншот, в котором отображается процесс выполнения приложения app_1-sms.js

Это приложение не выполняется, сервер выдает ошибку типа: "TypeError: db.collection is not a function". Эта ошибка связана с тем, что у меня установлена MongoDB версия 3.2.12 под 32 разрядную ОС Win 10 и драйвер mongodb версии "3.1.8".

В соответствии с изменениями для официального драйвера Node.js - mongodb версии 3.0 и более поздних версий теперь:

Mongo Client.connect('mongodb://localhost:27017/test', (err, db) => {
// Database returned
});
is replaced with
Mongo Client.connect('mongodb://localhost:27017/test', (err, client) => {
// Client returned
var db = client.db('test');
});

Итак, создадим новое приложение app_5_insertOne.js, в коде которого добавим insertOne() в базу данных "smsdb" один документ с записью {name: "Олексій Прокопенко", phone_numer: "+380668888888"}:


// для mongodb версии 3.0 и более поздних версий
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/smsdb";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, client){
    const db = client.db("smsdb");
    const collection = db.collection("employees");
	let employee = {name: "Олексій Прокопенко", phone_numer: "+380668888888"};
    collection.insertOne(employee, function(err, result){
        if(err){ 
            return console.log(err);
        }
        console.log(result.ops);
        client.close();
    });
});				

Теперь запустим приложение app_5_insertOne.js на выполнение во второй командной строке (из каталога WebSMS), для этого перейдем в каталог WebSMS, в который оно помещено:
C:\WebSMS>node app_5_insertOne.js

Процесс выполнения приложения app_5_insertOne.js
Рис. 5. Процесс выполнения приложения app_5_insertOne.js и извлечение записи документа из БД MongoDB

Файл app_5_find.js для извлечения записей документа из БД MongoDB имеет вид:


// для mongodb версии 3.0 и более поздних версий
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/smsdb";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, client){
    const db = client.db("smsdb");
    const collection = db.collection("employees");
    if(err) return console.log(err);
    collection.find().toArray(function(err, results){
        console.log(results);
        client.close();
    });
});				

Добавим две записи в базу данных smsdb, для этого создадим файл приложения app_5_insertMany.js c методом insertMany() и поместим его в каталог WebSMS, затем запустим его на выполнение во второй командной строке из каталога WebSMS:
C:\WebSMS>node app_5_insertMany.js

Процесс выполнения приложения app_5_insertMany.js
Рис. 6. Процесс выполнения приложения app_5_insertMany.js и извлечение записей документа из БД MongoDB

Известно, что к методам обновления документов относятся updateOne() и updateMany(). Проверим выполнение операции обновления, например, применим метод updateOne() коллекции "collection", который заменит один из существующих "phone_numer": "+380971111111" в документе коллекции "employees". Для этого создадим файл приложения app_5_update.js и поместим его в каталог WebSMS:


// для mongodb версии 3.0 и более поздних версий
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/smsdb";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, client){
    if(err) 
		return console.log(err);
    const db = client.db("smsdb");
    const collection = db.collection("employees");
    collection.updateOne(
        {phone_numer: "+380971111111"},              
        { $set: {phone_numer: "+380502222222"}},   
        function(err, result){
            console.log(result);
            client.close();
        }
    );
});		        

Запустим файл app_5_update.js на выполнение из каталога WebSMS:
C:\WebSMS>node app_5_update.js

Процесс выполнения приложения app_5_update.js
Рис. 7. Процесс выполнения приложения app_5_update.js и извлечение записей документа из БД MongoDB

Проверим выполнение операции удаление (delete). MongoDB предоставляет следующие методы для удаления документов из коллекции: deleteOne() - для одного документа, deleteMany() – для многих документов. Метод drop() удаляет всю коллекцию. Создадим приложение app_5_deleteMany.js с функцией deleteMany() в директории WebSMS:


// для mongodb версии 3.0 и более поздних версий
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/smsdb";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, client){
    if(err) 
		return console.log(err);
    const db = client.db("smsdb");
	const collection = db.collection("employees");
    db.collection("employees").deleteMany({name: "Олексій Прокопенко"}, function(err, result){
        console.log(result);
        client.close();
    });
});				

Запустим приложение app_5_deleteMany.js на выполнение:
C:\WebSMS>node app_5_deleteMany.js

Процесс выполнения приложения app_5_deleteMany.js
Рис. 8. Процесс выполнения приложения app_5_deleteMany.js
Продолжение процесса выполнения приложения app_5_deleteMany.js
Рис. 9. Продолжение процесса выполнения приложения app_5_deleteMany.js и извлечение записей документа из БД MongoDB

Рассмотрим метод удаления документов drop(), который удаляет всю коллекцию. В директории WebSMS создадим файл app_5_drop.js:


// для mongodb версии 3.0 и более поздних версий
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/smsdb";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, client){
    if(err) 
		return console.log(err);
    const db = client.db("smsdb");
    const collection = db.collection("employees");
     collection.drop(function(err, result){
        console.log(result);
        client.close();
    });
});		        

Запустим приложение app_5_drop.js на выполнение:
C:\WebSMS>node app_5_drop.js

Процесс выполнения приложения app_5_drop.js
Рис. 10. Процесс выполнения приложения app_5_drop.js и извлечение записей документа из БД MongoDB

В дальнейшем будет рассмотрен ODM MongoDB mongoose для организации работы между MongoDB и приложением, созданным на JS в среде Node.js.

Используемые источники информации:

  1. Node.js и MongoDB. [Электронный ресурс]. – Режим доступа: https://metanit.com/web/nodejs/6.1.php
  2. Node.js MongoDB. [Электронный ресурс]. – Режим доступа: https://www.w3schools.com/nodejs/nodejs_mongodb.asp
  3. GitHub - mongodb/node-mongodb-native: Mongo DB Native NodeJS Driver. [Электронный ресурс]. – Режим доступа: https://github.com/mongodb/node-mongodb-native
  4. MongoDB 2.0.0 Driver. [Электронный ресурс]. – Режим доступа: https://mongodb.github.io/node-mongodb-native/2.0/tutorials/crud_operations/
  5. node-mongodb-native/CHANGES_3.0.0.md. [Электронный ресурс]. – Режим доступа: https://github.com/mongodb/node-mongodb-native/blob/HEAD/CHANGES_3.0.0.md