Node.js: подключение к MongoDB

MongoDB — это документо-ориентированная система управления базами данных, написанная на C++.

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

Если у вас ещё нет базовых знаний о MongoDB, вы можете обратиться к нашему учебнику:Учебник по MongoDB。

Установка драйвера

В этом учебнике используетсяадаптированная для Taobao команда cnpmдля установки:

$ cnpm install mongodb

После успешной установки мы можем использовать объект MongoClient для подключения к базе данных:

Пример

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

async function main() {
    // URI подключения к MongoDB
    const uri = "mongodb://localhost:27017"; // Если вы используете удалённый экземпляр MongoDB, измените URI соответствующим образом

    // Создание нового MongoClient
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        // Подключиться к серверу MongoDB
        await client.connect();

        console.log("Успешно подключено к серверу");

     
    } finally {
        // Обязательно закройте соединение после завершения
        await client.close();
    }
}

main().catch(console.error);

Выполнение приведенного выше кода дает следующий вывод:

Connected successfully to server

Описание параметров подключения:

  • MongoClient: Это клиент MongoDB, используемый для подключения к базе данных.
  • uri: Это строка подключения MongoDB в форматеmongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]。
  • useNewUrlParserиuseUnifiedTopology— это некоторые параметры, используемые для предотвращения некоторых старых вариантов поведения при подключении.

Далее мы реализуем функции создания, чтения, обновления и удаления (CRUD).


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

Чтобы создать базу данных в MongoDB, сначала нужно создать объект MongoClient, затем настроить указанный URL и номер порта.

Если база данных не существует, MongoDB создаст базу данных и установит соединение.

Создайте соединение

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Здесь вы можете выполнять операции с базой данных, такие как создание коллекции или вставка документов const collection = database.collection('exampleCollection'); const doc = { name: "Example", type: "Test" }; const result = await collection.insertOne(doc); console.log(`Создан новый документ,ID: ${result.insertedId}`); } finally { //Не забудьте закрыть соединение по завершении await client.close(); } } main().catch(console.error);

Выполнение приведенного выше кода дает следующий вывод:

成功连接到服务器
新文档已创建,ID 为: 6678e18e0bb3f4247be610d8

Создание коллекции

Мы можем использовать метод createCollection() для создания коллекции:

Создание коллекции

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Используйте метод createCollection для создания коллекции const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`Коллекция ${collectionName}успешно создана`); //Получаем коллекцию const collection = database.collection(collectionName); //Создаём новый документ const doc = { name: "Пример", type: "Test" }; //Вставляем документ в коллекцию const result = await collection.insertOne(doc); console.log(`Новый документ создан,IDравен: ${result.insertedId}`); } finally { //Не забудьте закрыть соединение по завершении работы await client.close(); } } main().catch(console.error);

Выполнение приведенного выше кода дает следующий вывод:

成功连接到服务器
集合 exampleCollection 创建成功
新文档已创建,ID 为: 6678e1b5c742b3ebd57f9759

Операции с базой данных (CRUD)

В отличие от MySQL, MongoDB автоматически создаёт базы данных и коллекции, поэтому нам не нужно создавать их вручную перед использованием.

Вставка данных

В следующем примере мы подключаемся к таблице exampleCollection в базе данных example и вставляем фрагмент данных, используя insertOne():

Вставить один документ

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Используйте метод createCollection для создания коллекции const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`Коллекция ${collectionName}успешно создана`); //Получаем коллекцию const collection = database.collection(collectionName); //Создаём новый документ const doc = { name: "Alice", age: 25, address: "Wonderland" }; //Вставьте документ в коллекцию const result = await collection.insertOne(doc); console.log(`Создан новый документ,ID: ${result.insertedId}`); } finally { //Не забудьте закрыть соединение по завершении await client.close(); } } main().catch(console.error);

Выполните следующую команду, и результат вывода будет:

成功连接到服务器
集合 exampleCollection 创建成功
新文档已创建,ID 为: 6678e1d1f9503dc2e0e2a20b

Из результата вывода видно, что данные успешно вставлены.

Мы также можем открыть клиент MongoDB, чтобы просмотреть данные, например:

> show dbs
example  0.000GB          # 创建了 example 数据库

> use example             # 切换到 example 数据库

example> show tables
exampleCollection        # 创建了 exampleCollection 集合(数据表)
                    # 自动创建了 site 集合(数据表)
example> db.exampleCollection.find()
[
  {
    _id: ObjectId('6678e1d1f9503dc2e0e2a20b'),
    name: 'Alice',
    age: 25,
    address: 'Wonderland'
  }
]

Если вы хотите вставить несколько документов, вы можете использоватьinsertMany():

Вставить несколько документов

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Используйте метод createCollection для создания коллекции const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`Коллекция ${collectionName}успешно создана`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создано новых документов,ID: `); Object.keys(result.insertedIds).forEach((key, index) => { console.log(`Документ ${index + 1}: ${результат.insertedIds[key]}`); }); } finally { //Не забудьте закрыть соединение по завершении работы await client.close(); } } main().catch(console.error);

Результат выполнения:

成功连接到服务器
集合 exampleCollection 创建成功
3 个新文档已创建,ID 为:
文档 1: 6678e30e80ac30e5e689f13a
文档 2: 6678e30e80ac30e5e689f13b
文档 3: 6678e30e80ac30e5e689f13c

Запрос данных

Вы можете использовать find() для поиска данных. find() может возвращать все данные, соответствующие условиям. Если условия не указаны, find() возвращает все данные в коллекции.

find()

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Используйте метод createCollection для создания коллекции const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`Коллекция ${collectionName}успешно создана`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создано новых документов,ID: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`Документ ${index + 1}: ${id}`); }); //Запросить все документы в коллекции const query = {}; //Пустой объект запроса означает, что будут запрошены все документы const options = { projection: { _id: 0, name: 1, age: 1, address: 1 } }; //Выбрать только необходимые поля const cursor = collection.find(query, options); //Вывести все найденные документы const allValues = await cursor.toArray(); console.log("Найденные документы:"); console.log(allValues); } finally { //Не забудьте закрыть соединение по завершении работы await client.close(); } } main().catch(console.error);

Результат выполнения:

成功连接到服务器
集合 exampleCollection 创建成功
3 个新文档已创建,ID 为:
文档 1: 0
文档 2: 1
文档 3: 2
查询到的文档:
[
  { name: 'Alice', age: 25, address: 'Wonderland' },
  { name: 'Bob', age: 30, address: 'Builderland' },
  { name: 'Charlie', age: 35, address: 'Chocolate Factory' }
]

Следующий пример извлекает экземпляры, где name — "Alice":

Запрос данных с указанными условиями

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Используйте метод createCollection для создания коллекции const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`Коллекция ${collectionName}успешно создана`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Запрос документов с использованием параметра name const query = { name: "Alice" }; //Критерии поиска const options = { projection: { _id: 0, name: 1, age: 1, address: 1 } }; //Выберите только необходимые поля const cursor = collection.find(query, options); //Вывести запрошенные документы const allValues = await cursor.toArray(); console.log("Найденные документы:"); console.log(allValues); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

Результат выполнения следующей команды:

成功连接到服务器
集合 exampleCollection 创建成功
3 个新文档已创建,ID 为:
文档 1: 0
文档 2: 1
文档 3: 2
查询到的文档:
[
  { name: 'Alice', age: 25, address: 'Wonderland' }
]

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

Мы также можем изменять данные в базе данных. Следующий пример обновит данные, где name имеет значение 'Alice':

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

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Укажите условия, обновите данные на основе параметра name const filter = { name: "Alice" }; //Критерии поиска const updateDoc = { $set: { age: 28, address: "New Wonderland" }, }; const updateResult = await collection.updateOne(filter, updateDoc); console.log(`${updateResult.matchedCount}document(s) matched the filter criteria`); console.log(`${updateResult.modifiedCount}document(s) have been updated`); //Запросите обновлённые документы const updatedDocument = await collection.findOne(filter); console.log("Обновленные документы:"); console.log(updatedDocument); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

После успешного выполнения вывод будет следующим:

成功连接到服务器
集合 exampleCollection 创建成功
3 个新文档已创建,ID 为:
文档 1: 0
文档 2: 1
文档 3: 2
1 个文档匹配筛选条件
1 个文档已更新
更新后的文档:
{
  _id: new ObjectId('6678e1d1f9503dc2e0e2a20b'),
  name: 'Alice',
  age: 28,
  address: 'New Wonderland'
}

Если вы хотите обновить все документы, соответствующие критериям, можно использоватьupdateMany():

Обновление нескольких документов

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Alice", age: 28, address: "Old Wonderland" } ]; //Вставить несколько документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Укажите условия, обновите несколько документов на основе параметра name const filter = { name: "Alice" }; //Критерии поиска const updateDoc = { $set: { address: "Updated Wonderland" }, }; const updateResult = await collection.updateMany(filter, updateDoc); console.log(`${updateResult.matchedCount}document(s) matched the filter criteria`); console.log(`${updateResult.modifiedCount}document(s) have been updated`); //Запросите обновлённые документы const updatedDocuments = await collection.find(filter).toArray(); console.log("Обновленные документы:"); console.log(updatedDocuments); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

Удаление данных

Следующий пример удаляет данные, где name равно 'Alice':

Удаление одного документа

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Укажите условия, удалите один документ на основе параметра name const filter = { name: "Alice" }; //Критерии поиска const deleteResult = await collection.deleteOne(filter); console.log(`${deleteResult.deletedCount}документ(ы) были удалены`); //Запросить все документы в коллекции, чтобы подтвердить удаление const remainingDocuments = await collection.find({}).toArray(); console.log("Оставшиеся документы:"); console.log(remainingDocuments); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

После успешного выполнения вывод:

成功连接到服务器
集合 exampleCollection 创建成功
3 个新文档已创建,ID 为:
文档 1: 0
文档 2: 1
文档 3: 2
1 个文档已删除
剩余的文档:
[
  {
    _id: new ObjectId('6678e18e0bb3f4247be610d8'),
    name: 'Example',
    type: 'Test'
  },
...

Если вы хотите удалить несколько документов, вы можете использоватьdeleteMany()метод

Следующий пример удаляет все данные, где type равно 'en':

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

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Alice", age: 28, address: "Old Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Укажите условия, удалите несколько документов на основе параметра name const filter = { name: "Alice" }; //Критерии поиска const deleteResult = await collection.deleteMany(filter); console.log(`${deleteResult.deletedCount}документ(ы) были удалены`); //Запросите все документы в коллекции, чтобы подтвердить удаление const remainingDocuments = await collection.find({}).toArray(); console.log("Оставшиеся документы:"); console.log(remainingDocuments); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

Sort

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

Например:

{ type: 1 }  // 按 type 字段升序
{ type: -1 } // 按 type 字段降序

Сортировка по type по возрастанию:

Сортировка

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" }, { name: "Dave", age: 20, address: "Dreamland" } ]; //Вставить несколько документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Сортировка документов с помощью метода sort() //Сортировка по полю age по возрастанию const sortedDocsAsc = await collection.find().sort({ age: 1 }).toArray(); console.log("Документы, отсортированные по полю age по возрастанию:"); console.log(sortedDocsAsc); //Сортировка по полю age по убыванию const sortedDocsDesc = await collection.find().sort({ age: -1 }).toArray(); console.log("Документы, отсортированные по полю age в порядке убывания:"); console.log(sortedDocsDesc); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

Пагинация запросов

Если вы хотите задать количество возвращаемых документов, можно использоватьlimit()метод, который принимает только один параметр, задающий количество возвращаемых документов.

limit(): Чтение двух документов

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" }, { name: "Dave", age: 20, address: "Dreamland" }, { name: "Eve", age: 22, address: "Eden" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Используйте метод limit(), чтобы ограничить количество результатов запроса const limitedDocs = await collection.find().limit(3).toArray(); console.log("Ограничение результатов запроса до 3 документов:"); console.log(limitedDocs); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

Если вы хотите указать количество документов для пропуска, можно использовать методskip().

Метод skip() используется для пропуска указанного количества документов и возврата результатов запроса оставшихся документов.

skip(): пропустить первые два документа и прочитать два документа

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('example'); //Создайте коллекцию с помощью метода createCollection const collectionName = 'exampleCollection'; await database.createCollection(collectionName); console.log(`collection ${collectionName}created successfully`); //Получаем коллекцию const collection = database.collection(collectionName); //Создайте несколько новых документов const docs = [ { name: "Alice", age: 25, address: "Wonderland" }, { name: "Bob", age: 30, address: "Builderland" }, { name: "Charlie", age: 35, address: "Chocolate Factory" }, { name: "Dave", age: 20, address: "Dreamland" }, { name: "Eve", age: 22, address: "Eden" } ]; //Вставка нескольких документов в коллекцию const result = await collection.insertMany(docs); console.log(`${result.insertedCount}создан новый документ (документы),IDкак: `); Object.keys(result.insertedIds).forEach((id, index) => { console.log(`document ${index + 1}: ${id}`); }); //Используйте метод skip(), чтобы пропустить первые два документа и вернуть оставшиеся документы const skippedDocs = await collection.find().skip(2).toArray(); console.log("Результаты запроса после пропуска первых двух документов:"); console.log(skippedDocs); } finally { //Обязательно закройте соединение по завершении await client.close(); } } main().catch(console.error);

Операция подключения

MongoDB не является реляционной базой данных, но мы можем использовать$lookupдля реализации левого соединения.

$lookup — это оператор конвейера агрегации в MongoDB, используемый для выполнения левых внешних соединений. Его можно использовать для поиска документов в одной коллекции, которые соответствуют условиям в другой коллекции, и объединения их вместе.

Например, у нас есть две коллекции со следующими данными:

Коллекция 1: orders

[
  { "_id": 1, "product_id": 101, "quantity": 2 },
  { "_id": 2, "product_id": 102, "quantity": 1 },
  { "_id": 3, "product_id": 103, "quantity": 4 }
]

Коллекция 2: products

[
  { "_id": 101, "name": "Product A", "price": 50 },
  { "_id": 102, "name": "Product B", "price": 70 },
  { "_id": 103, "name": "Product C", "price": 100 },
  { "_id": 104, "name": "Product D", "price": 120 }
]

Теперь мы хотим использовать операцию $lookup, чтобы связать поле product_id в коллекции orders с полем _id в коллекции products и получить подробную информацию о товаре для каждого заказа.

Ниже приведён пример агрегации MongoDB, реализующий эту функциональность:

Пример

const { MongoClient } = require('mongodb'); async function main() { //URI подключения MongoDB const uri = "mongodb://localhost:27017"; //Пожалуйста, измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); try { //Подключитесь к серверу MongoDB await client.connect(); console.log("Успешно подключено к серверу"); //Укажите базу данных const database = client.db('mydatabase'); //коллекция orders const ordersCollection = database.collection('orders'); //коллекция products const productsCollection = database.collection('products'); //Определите конвейер агрегации и используйте $lookup для выполнения левого внешнего соединения const pipeline = [ { $lookup: { from: 'products', //Имя коллекции для соединения localField: 'product_id', //Поле из локальной коллекции для сопоставления foreignField: '_id', //Поле из присоединённой коллекции для сопоставления as: 'productDetails' //Имя поля для включения в выходные результаты } } ]; //Выполнить операцию агрегации const result = await ordersCollection.aggregate(pipeline).toArray(); //Вывести результаты запроса console.log("Результаты запроса левого внешнего соединения:"); console.log(result); } finally { //Не забудьте закрыть соединение по завершении работы await client.close(); } } main().catch(console.error);

Удаление коллекции

Мы можем использоватьdrop()метод для удаления коллекции:

drop()

var MongoClient = require('mongodb').MongoClient; var url = "mongodb://localhost:27017/"; MongoClient.connect(url, function(err, db) { if (err) throw err; var dbo = db.db("example"); //Удалите тестовую коллекцию dbo.collection("test").drop(function(err, delOK) { //Если успешно, delOK возвращает true; в противном случае возвращает false if (err) throw err; if (delOK) console.log("Коллекция удалена"); db.close(); }); });

Использование Promise

Promise — это класс, предоставляемый ECMAScript 6, предназначенный для более элегантного написания сложных асинхронных задач.

Если вы ещё не понимаете Promise, можете обратиться кJavaScript Promise。

В следующем примере Promise используется для создания коллекции:

Пример

const { MongoClient } = require('mongodb'); //URI подключения к MongoDB const uri = "mongodb://localhost:27017"; //Измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); //Используйте Promise для обёртывания процесса подключения к базе данных function connectDB() { return new Promise((resolve, reject) => { //Подключение к серверу MongoDB client.connect((err) => { if (err) { reject(err); } else { console.log("Успешно подключено к серверу MongoDB"); resolve(client.db()); //Возвращает экземпляр базы данных } }); }); } //Пример использования connectDB() .then(database => { //Здесь можно продолжить выполнять операции с базой данных console.log("Успешно подключено к базе данных"); //Пример: вывести имя базы данных console.log("Имя базы данных:", database.databaseName); //Если вам нужно выполнить другие операции, вы можете продолжить писать код здесь //Например, запросы, вставка документов и т. д. //Наконец, закройте соединение client.close(); }) .catch(err => { console.error("Произошла ошибка при подключении к базе данных:", err); });

Операции с данными через Promise

Теперь давайте реализуем четыре последовательные операции в одной программе: добавление, запрос, обновление и удаление.

Пример

const { MongoClient, ObjectId } = require('mongodb'); //URI подключения к MongoDB const uri = "mongodb://localhost:27017"; //Измените его в соответствии с адресом вашего сервера MongoDB //Создайте новый MongoClient const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); //Используйте Promise для обёртывания процесса подключения к базе данных function connectDB() { return new Promise((resolve, reject) => { //Подключение к серверу MongoDB client.connect((err) => { if (err) { reject(err); } else { console.log("Успешно подключено к серверу MongoDB"); resolve(client.db()); //Возвращает экземпляр базы данных } }); }); } //Функция для добавления документа function insertDocument(db, document) { const collection = db.collection('documents'); return new Promise((resolve, reject) => { collection.insertOne(document, (err, result) => { if (err) { reject(err); } else { console.log("Документ успешно добавлен"); resolve(result); } }); }); } //Функция для запроса документов function findDocuments(db) { const collection = db.collection('documents'); return new Promise((resolve, reject) => { collection.find({}).toArray((err, docs) => { if (err) { reject(err); } else { console.log("Результат запроса документов:"); console.log(docs); resolve(docs); } }); }); } //Функция для обновления документа function updateDocument(db, id, updatedValues) { const collection = db.collection('documents'); return new Promise((resolve, reject) => { collection.updateOne({ _id: ObjectId(id) }, { $set: updatedValues }, (err, result) => { if (err) { reject(err); } else { console.log("Документ успешно обновлён"); resolve(result); } }); }); } //Функция для удаления документа function deleteDocument(db, id) { const collection = db.collection('documents'); return new Promise((resolve, reject) => { collection.deleteOne({ _id: ObjectId(id) }, (err, result) => { if (err) { reject(err); } else { console.log("Документ успешно удалён"); resolve(result); } }); }); } //Пример использования: последовательно выполните операции добавления, запроса, обновления и удаления async function performOperations() { try { const database = await connectDB(); //Добавить документ const insertResult = await insertDocument(database, { name: "Документ 1" }); //Запросить документы const findResult = await findDocuments(database); //Обновить документ const updatedDocId = insertResult.insertedId; //Используйте ID, возвращённый при вставке документа, для обновления const updateResult = await updateDocument(database, updatedDocId, { name: "Обновлённый документ 1" }); //Удалить документ const deleteResult = await deleteDocument(database, updatedDocId); //Вывести результаты операции console.log("Финальная операция завершена:"); console.log("Результат удаления документа:", deleteResult); } catch (err) { console.error("Произошла ошибка при выполнении операции:", err); } finally { //Не забудьте закрыть соединение по завершении работы await client.close(); } } //Выполнить операцию performOperations();

Результат выполнения:

数据库已连接
[ { _id: 5f1664966833e531d83d3ac6, site: 'example.com' } ]
[ { _id: 5f1664966833e531d83d3ac6, site: 'example.com' } ]
[]
Другие расширения