Вступление
- Минимальная версия A-Parser:
- 1.2.1312
В этой статье рассмотрим пример интеграции А-Парсера с MongoDB. В особенности CRUD операции. В качестве хранимых данных в базе, будет результат работы SE::Bing.
Из Википедии:
MongoDB можно запускать локально, в частной или гибридной облачной среде, и даже в выделенном облаке mongodb.com.
Перед началом нужно зарегистрироваться в MongoDB Cloud.
Начальная настройка
Регистрируемся. Создаём проект. Далее выбор типа кластера.
Самый простой и доступный - FREE. Вот его характеристики:
После чего нужно подождать создание кластера и сделать первые настройки. По сути там всё понятно, есть всплывающая подсказка с шагами которые нужно сделать. Создать пользователя базы. Добавить IP которое сможет иметь доступ к базе. Выбрать способ подключения:
Выбираем подключение на основе использования Node.js модуля. И предоставляется строка соединения с базой:
У каждого юзера MongoDB будет своя строка.Код:mongodb+srv://admin:<password>@cluster0.kkzia.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
Перейдя в коллекции (Collections) можно увидеть нашу базу. Изначально она будет пустой и будет предложено создать новую базу и первую коллекцию в базе. Создаём.
Установка модуля и полезные ссылки
Теперь нужно установить MongoDB модуль в А-Парсере.
Полезные ссылки:Код:npm install mongodb
- Инструкция по установке дополнительных модулей в А-Парсер.
- Документация работы на Node.js с MongoDB
- Node.js MongoDB Driver API
Подключение к базе
Теперь создаем в А-Парсере новый TS парсер (Как создать TS парсер). И прописываем подключение к базе:
Так как мы хотим сохранять в базу результат полученный парсером SE::Bing, то добавим возможность настройки конфига для него:Код: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(); }
Код: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; }
Получаем экземпляр коллекции:
Полученный результат работы парсера SE::Bing храним в виде json в переменной response.Код:let collection = client.db('exampledb').collection('testcoll');
Добавление
Добавление можно сделать как одного документа, так и массива документов.
Как это выглядит в логе А-Парсера:Код: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}`); }
Как это выглядит в MongoDB:
Добавление массива документов:
ЧтениеКод: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; }
Редактирование
Редактирование поля 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)); } }
Удаление
Удаляем все документы в которых 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"); }
Готовый парсер:
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
MongoDB также обладает многими другими удобными методами которые не было рассмотрено в статье. С ними вы можете ознакомиться в официальной документации MongoDB
-
Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!Скрыть объявление
Пример интеграции А-Парсера с MongoDB. CRUD Операции
В этой статье рассмотрим пример интеграции А-Парсера с MongoDB. В особенности CRUD операции
Метки: