MongoDB был одним из первых хранилищ данных NoSQL, и это самое популярное хранилище данных NoSQL Cегодня. В Node.js Среда выполнения JavaScript продолжает занимать доминирующее место в серверной разработке. Вместе они составляют очень гибкий и динамичный стек технологий.

Как вы увидите, Node.js и MongoDB позволяют быстро реализовать важные функции приложения, такие как операции CRUD (создание, чтение, обновление и удаление). В этой статье мы рассмотрим основы CRUD, используя последнюю версию драйвера MongoDB для Node.js (версия 3.6+).

Настройка Node.js и MongoDB

Вам потребуются установленные в вашей системе Node.js и MongoDB, а также командная строка с curl команда доступна. (Если вы используете версию Linux, MacOS или Windows 10 с 2018 года, у вас, скорее всего, завиток.)

Вы можете скачать MongoDB для своей ОС здесь. После загрузки вы можете установить его как службу или запустить как исполняемый файл. В любом случае убедитесь, что MongoDB работает, открыв командную строку и запустив mongo команда. (Возможно, вам потребуется добавить команду в свой путь, если вы не устанавливали его как службу.) Это дает вам доступ к экземпляру MongoDB, работающему в вашей системе.

Затем убедитесь, что у вас установлены Node.js и npm. В командной строке введите node -v. Если установлен Node.js, вы получите номер версии. Если нет, перейдите к страница загрузки Node.js и установите Node на свой компьютер.

Curl позволяет выполнять простые HTTP-запросы из командной строки. Например, если вы запустите curl www.google.com вы получите разметку с главной страницы Google.

Создайте проект Node.js

Теперь перейдите в удобную папку, где вы создадите новый проект. Тип npm init. В качестве имени проекта используйте node-mongo-intro. Вы можете принять другие значения по умолчанию.

Теперь добавьте нужные зависимости. В только что созданном каталоге проекта введите npm install mongodb polka --save. Это установит как драйвер Node.js для MongoDB (позволяющий вашему проекту получить доступ к MongoDB), так и HTTP-сервер польки, который вы будете использовать для обработки HTTP-запросов.

Отредактируйте файл package.json, включив в него сценарий запуска, как в листинге 1.

Листинг 1. Стартовый скрипт

"scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "start": "node src/index" // <-- add this line
  },

Теперь создайте файл /node-mongo-intro/src/index.js и поместите в него содержимое листинга 2.

Листинг 2. HTTP-тест в index.js

const polka = require('polka');

polka()
  .get('/create', (req, res) => {
    res.end(`works`);
  })
  .listen(3000, err => {
    if (err) throw err;
    console.log(`> Running on localhost:3000`);
  });

Теперь запустите сервер с npm run start. Сервер будет прослушивать порт 3000. Вы можете проверить это с помощью curl http://localhost:3000/create. Если вы это сделаете, вы должны увидеть ответ (вместе с некоторой информацией о запросе curl) «работает».

Вставить запись в MongoDB

Теперь сделаем простую вставку. Это C в CRUD. Обновите index.js файл, чтобы он выглядел как в листинге 3.

Листинг 3. Простая вставка

const polka = require('polka');
const { MongoClient } = require("mongodb");

polka()
  .get('/create', (req, res) => {
    const client = new MongoClient("mongodb://localhost:27017");
    async function run() {
      try {
        await client.connect();
        const database = client.db("intro");
        const collection = database.collection("quotes");

        const result = await collection.insertOne({"quote":"Life is what happens to you while you're busy making other plans."});
        res.end(JSON.stringify(result));
      } catch (e) {
        console.log("Error: " + e);
      } finally {
        await client.close();
      }
    }
    run().catch(console.dir);
  })
  .listen(3000, err => {
    if (err) throw err;
    console.log(`> Running on localhost:3000`);
  });

Код в листинге 3 открывает соединение с экземпляром MongoDB в вашей локальной системе, а затем указывает базу данных ("intro") и сбор ("quotes"). Коллекция аналогична таблице в реляционной базе данных.

Затем код вставляет документ (аналогично записи SQL) и отправляет результаты обратно в HTTP-ответе.

Запустить вставку

Сначала остановите и перезапустите сервер узла, нажав Ctrl-C. Затем запустите эту команду в командной строке:

npm run startcurl http://localhost:3000/create

Проверить вставку

Если вы знакомы с SQL, вы заметите, что мы не создавали таблицу и схему до того, как выполнили эту работу. Мы даже не создали базу данных, которую использовали. MongoDB делает все это за нас и может принимать в коллекцию любой структурированный документ типа ключ-значение.

Откройте оболочку mongo с помощью mongo, и введите команду use intro. Это переключится на вводную базу данных, которая была создана автоматически. Теперь войдите в db.quotes.find() , и вы увидите, что запись была вставлена. Обратите внимание, что MongoDB автоматически сгенерировал уникальный идентификатор на "_id" поле. Вы можете переопределить это, указав его самостоятельно в документе.

Получить документ в MongoDB

Теперь вернем документ. Добавить .get() отображение показано в листинге 4. Это R в CRUD.

Листинг 4. Получить документ

.get('/retrieve', (req, res) => {
    const client = new MongoClient("mongodb://localhost:27017");
    async function run() {

      try {
        await client.connect();
        const database = client.db("intro");
        const collection = database.collection("quotes");

        const cursor = collection.find({}, {});

        let items = [];
        await cursor.forEach(function(doc){
          items.push(doc);
        });
        res.end(JSON.stringify(items));
      } catch (error){
        console.warn("ERROR: " + error);
        if (errCallback) errCallback(error);
      } finally {
        await client.close();
      }
    }
    run().catch(console.dir);
  })

В листинге 4 выполняется подключение таким же образом, как в листинге 3, а затем выполняется find команда с пустым запросом. Это означает, что он соответствует всем документам. Затем он принимает ответ и помещает его в массив для отправки обратно клиенту.

Обратите внимание, что операции с курсором асинхронны, как и collection.insertOne операция из листинга 3. Мы используем await ключевое слово для их обработки без вложенных обратных вызовов.

Протестируйте новую конечную точку (после остановки и повторного запуска сервера) с помощью curl http://localhost:3000/retrieve и вы увидите, что коллекция возвращена.

Обновить документ в MongoDB

Теперь о U в CRUD. Это описано в листинге 5.

Листинг 5. Обновление документа

.get('/update', (req, res) => {
    const client = new MongoClient("mongodb://localhost:27017");
    async function run() {
      try {
        await client.connect();
        const database = client.db("intro");
        const collection = database.collection("quotes");

        const updateDoc = {
          $set: {
            author:
              "John Lennon",
          },
        };

        const result = await collection.updateOne({}, updateDoc, {}); // <-- empty filter matches all docs
        res.end("Updated: " + result.modifiedCount);
      } catch (e) {
        errCallback(e);
      } finally {
        await client.close();
      }
    }
    run().catch(console.dir);
  })

Листинг 5 снова подключается к базе данных, а затем создает документ обновления. Этот документ сообщает MongoDB, что нужно изменить, указав $set поле, содержащее объект с полями и значениями, которые нужно изменить. В нашем случае мы устанавливаем author поле для "John Lennon", кавычка рассматриваемой цитаты.

Далее в листинге 5 используется updateOne() функция для выполнения документа обновления. Последний аргумент пустого объекта – это фильтр. В этом случае мы хотим сопоставить все документы, поэтому оставим поле пустым.

Наконец, мы отправляем обратно количество обновленных документов (один).

Удалить документ в MongoDB

Последняя буква в аббревиатуре CRUD – D для удаления.

Отображение для операции удаления показано в листинге 6.

Листинг 6. Удаление документа

.get('/delete', (req, res) => {
    const client = new MongoClient("mongodb://localhost:27017");
    async function run() {
      try {
        await client.connect();
        const database = client.db("intro");
        const collection = database.collection("quotes");
        const query = { };
        const result = await collection.deleteOne(query);
        if (result.deletedCount === 1) {
          res.end("Successfully deleted one document.");
        } else {
          res.end("Deleted 0 documents.");
        }
      } finally {
        await client.close();
      }
    }

Здесь мы снова используем пустой запрос, чтобы сопоставить все документы в "quotes" коллекция. Асинхронный collection.deleteOne() функция возвращает результат, сообщающий нам, сколько документов было затронуто.

Перезагрузите сервер (Ctrl-C) и введите новую команду curl:

curl http://localhost:3000/delete

You can verify the doucument has been deleted with curl http://localhost:3000/retrieve.

Динамический дуэт CRUD

Вот и все, полный жизненный цикл документа в хранилище данных MongoDB: создание, чтение, обновление и удаление.

Комбинация Node.js и MongoDB (с некоторой помощью от Polka) обеспечивает очень быструю и гибкую разработку. Узнать больше о Node.js здесь и многое другое о MongoDB и других хранилищах данных NoSQL здесь.

Авторские права © 2021 IDG Communications, Inc.


#Как #выполнить #CRUD #помощью #Nodejs #MongoDB

Source link