1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

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

В этой статье рассмотрим пример интеграции А-Парсера с MongoDB. В особенности CRUD операции

  1. Support Ilia
    Минимальная версия A-Parser:
    1.2.1312
    Вступление

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

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

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

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

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

    [​IMG]

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

    [​IMG]


    Выбираем подключение на основе использования 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}`);
    }
    Как это выглядит в логе А-Парсера:
    [​IMG]

    Как это выглядит в MongoDB:
    [​IMG]

    Добавление массива документов:
    Код:
    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;
    }
    [​IMG]

    [​IMG]

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

    Редактирование поля 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));
        }
    }
    [​IMG]

    [​IMG]


    Удаление

    Удаляем все документы в которых 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");
    }
    [​IMG]

    [​IMG]


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

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