Пример интеграции А-Парсера с MongoDB. CRUD Операции

Пример интеграции А-Парсера с MongoDB. CRUD Операции

English Name
An example of A-Parser integration with MongoDB. CRUD Operations
Минимальная версия A-Parser
1.2.1312
Вступление

В этой статье рассмотрим пример интеграции А-Парсера с MongoDB. В особенности CRUD операции. В качестве хранимых данных в базе, будет результат работы SE::Bing.

Из Википедии:
MongoDB — документоориентированная система управления базами данных, не требующая описания схемы таблиц. Считается одним из классических примеров NoSQL-систем, использует JSON-подобные документы и схему базы данных. Написана на языке C++. Применяется в веб-разработке, в частности, в рамках JavaScript-ориентированного стека MEAN.

MongoDB можно запускать локально, в частной или гибридной облачной среде, и даже в выделенном облаке mongodb.com.

Перед началом нужно зарегистрироваться в MongoDB Cloud.

Начальная настройка

Регистрируемся. Создаём проект. Далее выбор типа кластера.
Самый простой и доступный - FREE. Вот его характеристики:

Create_Cluster___Atlas__MongoDB_Atlas_-_Google_Chrome_2021-06-22_16.04.22.png


После чего нужно подождать создание кластера и сделать первые настройки. По сути там всё понятно, есть всплывающая подсказка с шагами которые нужно сделать. Создать пользователя базы. Добавить IP которое сможет иметь доступ к базе. Выбрать способ подключения:

Clusters___Atlas__MongoDB_Atlas_-_Google_Chrome_2021-06-22_16.15.10.png



Выбираем подключение на основе использования Node.js модуля. И предоставляется строка соединения с базой:
Код:
mongodb+srv://admin:<password>@cluster0.kkzia.mongodb.net/myFirstDatabase?retryWrites=true&w=majority

У каждого юзера MongoDB будет своя строка.

Перейдя в коллекции (Collections) можно увидеть нашу базу. Изначально она будет пустой и будет предложено создать новую базу и первую коллекцию в базе. Создаём.

Установка модуля и полезные ссылки

Теперь нужно установить MongoDB модуль в А-Парсере.
Код:
npm install mongodb

Полезные ссылки:

Подключение к базе

Теперь создаем в А-Парсере новый TS парсер (Как создать TS парсер). И прописываем подключение к базе:
Код:
const { MongoClient } = require("mongodb");

let client;

async init() {

const uri = "mongodb+srv://admin:[email protected]/myFirstDatabase?retryWrites=true&w=majority";

client = new MongoClient(uri, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    });

    await client.connect();
}

async destroy() {
    if(client) await client.close();
}

Так как мы хотим сохранять в базу результат полученный парсером SE::Bing, то добавим возможность настройки конфига для него:
Код:
tatic defaultConf: typeof BaseParser.defaultConf = {
    version: '0.0.1',
    results: {},
    results_format: "",
    SE_Bing_preset: 'default',
};

static get editableConf() {
    let editableConf: typeof BaseParser.editableConf = [
        ['SE_Bing_preset', ['combobox', 'SE::Bing preset']],
    ];

    return editableConf;
}


Получаем экземпляр коллекции:
Код:
let collection = client.db('exampledb').collection('testcoll');

Полученный результат работы парсера SE::Bing храним в виде json в переменной response.



Добавление

Добавление можно сделать как одного документа, так и массива документов.
Код:
try {
    // добавляем 1 документ в базу
    this.logger.put('Create');
    await this.createOne(collection, response);
}catch(e) {
    this.logger.put('Error: ' + e.stack);
}

async createOne(collection, document){
    const result = await collection.insertOne(document);
    this.logger.put(`${result.insertedCount} document was inserted with the _id: ${result.insertedId}`);
}

Как это выглядит в логе А-Парсера:
A-Parser__Advanced_SE_Parser_%26_Analyze_tool_-_Google_Chrome_2021-06-24_10.48.02.png


Как это выглядит в MongoDB:
Data___Atlas__MongoDB_Atlas_-_Google_Chrome_2021-06-24_10.49.10.png


Добавление массива документов:
Код:
async createMany(collection, documents) {
    try {
        const insertManyresult = await collection.insertMany(documents);
        let ids = insertManyresult.insertedIds;
        this.logger.put(`${insertManyresult.insertedCount} documents were inserted.`);
        for (let id of Object.values(ids)) {
            this.logger.put(`Inserted a document with id ${id}`);
        }
    } catch (e) {
        this.logger.put(`A MongoBulkWriteException occurred, but there are successfully processed documents.`);
        let ids = e.result.result.insertedIds;
        for (let id of Object.values(ids)) {
            this.logger.put(`Processed a document with id ${id._id}`);
        }
        this.logger.put(`Number of documents inserted: ${e.result.result.nInserted}`);
    }
}

Чтение

Чтение всех документов в базе:
Код:
// читаем все документы в базе
let docs = [];
this.logger.put('Read');
this.logger.put('Read all documents:');
docs = await this.readAll(collection);

for(let doc of docs) {
    this.logger.put(JSON.stringify(doc));
}

async readAll(collection) {
    let documents = [];
    const cursor = collection.find({});
    for await (const doc of cursor) {
        documents.push(doc);
    }
    return documents;
}
A-Parser__Advanced_SE_Parser_%26_Analyze_tool_-_Google_Chrome_2021-06-24_11.53.32.png


Data___Atlas__MongoDB_Atlas_-_Google_Chrome_2021-06-24_11.54.41.png


Редактирование

Редактирование поля date каждого документа по его ID:
Код:
// Редактируем дату во всех документах
this.logger.put('Update');
for(let doc of docs) {
    let newDate = Date.now();
    this.logger.put(`Update document with id ${doc._id}. Old date: ${doc.date}. New date: ${newDate}`);
    await this.updateOne(collection, doc._id, newDate);
}

this.docsToLogs(await this.readAll(collection));

async updateOne(collection, id, newDate) {
    const filter = { _id: id };
    const updateDocument = {
        $set: { "date": newDate }
    };
    const result = await collection.updateMany(filter, updateDocument);
}

Вывод документов выносим в отдельную функцию:
Код:
docsToLogs(docs){
    this.logger.put('Read all documents:');
    for(let doc of docs) {
        this.logger.put(JSON.stringify(doc));
    }
}

A-Parser__Advanced_SE_Parser_%26_Analyze_tool_-_Google_Chrome_2021-06-24_12.03.06.png


Data___Atlas__MongoDB_Atlas_-_Google_Chrome_2021-06-24_12.04.48.png



Удаление

Удаляем все документы в которых totalcount меньше чем 1000:
Код:
this.logger.put('Delete');
await this.deleteMany(collection, 1000);

this.docsToLogs(await this.readAll(collection));

async deleteMany(collection, totalCountLess) {
    const query = { totalcount: { $lt: totalCountLess } };
    const result = await collection.deleteMany(query);
    this.logger.put('deleteMany result: ' + JSON.stringify(result));
    this.logger.put("Deleted " + result.deletedCount + " documents");
}

A-Parser__Advanced_SE_Parser_%26_Analyze_tool_-_Google_Chrome_2021-06-24_12.10.07.png


Data___Atlas__MongoDB_Atlas_-_Google_Chrome_2021-06-24_12.10.48.png



Готовый парсер:
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

MongoDB также обладает многими другими удобными методами которые не было рассмотрено в статье. С ними вы можете ознакомиться в официальной документации MongoDB
Автор
Support Ilia
Просмотры
1
Первый выпуск
Обновление

Рейтинги

0,00 звёзд Оценок: 0

Ещё ресурсы от Support Ilia

Назад
Верх