- English Name
- An example of A-Parser integration with MongoDB. CRUD Operations
- Минимальная версия A-Parser
- 1.2.1312
Вступление
В этой статье рассмотрим пример интеграции А-Парсера с MongoDB. В особенности CRUD операции. В качестве хранимых данных в базе, будет результат работы SE::Bing.
Из Википедии:
MongoDB можно запускать локально, в частной или гибридной облачной среде, и даже в выделенном облаке mongodb.com.
Перед началом нужно зарегистрироваться в MongoDB Cloud.
Начальная настройка
Регистрируемся. Создаём проект. Далее выбор типа кластера.
Самый простой и доступный - FREE. Вот его характеристики:
После чего нужно подождать создание кластера и сделать первые настройки. По сути там всё понятно, есть всплывающая подсказка с шагами которые нужно сделать. Создать пользователя базы. Добавить IP которое сможет иметь доступ к базе. Выбрать способ подключения:
Выбираем подключение на основе использования Node.js модуля. И предоставляется строка соединения с базой:
У каждого юзера MongoDB будет своя строка.
Перейдя в коллекции (Collections) можно увидеть нашу базу. Изначально она будет пустой и будет предложено создать новую базу и первую коллекцию в базе. Создаём.
Установка модуля и полезные ссылки
Теперь нужно установить MongoDB модуль в А-Парсере.
Полезные ссылки:
Подключение к базе
Теперь создаем в А-Парсере новый TS парсер (Как создать TS парсер). И прописываем подключение к базе:
Так как мы хотим сохранять в базу результат полученный парсером SE::Bing, то добавим возможность настройки конфига для него:
Получаем экземпляр коллекции:
Полученный результат работы парсера SE::Bing храним в виде json в переменной response.
Добавление
Добавление можно сделать как одного документа, так и массива документов.
Как это выглядит в логе А-Парсера:
Как это выглядит в MongoDB:
Добавление массива документов:
Чтение
Чтение всех документов в базе:
Редактирование
Редактирование поля date каждого документа по его ID:
Вывод документов выносим в отдельную функцию:
Удаление
Удаляем все документы в которых totalcount меньше чем 1000:
Готовый парсер:
MongoDB также обладает многими другими удобными методами которые не было рассмотрено в статье. С ними вы можете ознакомиться в официальной документации MongoDB
В этой статье рассмотрим пример интеграции А-Парсера с MongoDB. В особенности CRUD операции. В качестве хранимых данных в базе, будет результат работы SE::Bing.
Из Википедии:
MongoDB можно запускать локально, в частной или гибридной облачной среде, и даже в выделенном облаке mongodb.com.
Перед началом нужно зарегистрироваться в MongoDB Cloud.
Начальная настройка
Регистрируемся. Создаём проект. Далее выбор типа кластера.
Самый простой и доступный - FREE. Вот его характеристики:
После чего нужно подождать создание кластера и сделать первые настройки. По сути там всё понятно, есть всплывающая подсказка с шагами которые нужно сделать. Создать пользователя базы. Добавить IP которое сможет иметь доступ к базе. Выбрать способ подключения:
Выбираем подключение на основе использования Node.js модуля. И предоставляется строка соединения с базой:
Код:
mongodb+srv://admin:<password>@cluster0.kkzia.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
У каждого юзера MongoDB будет своя строка.
Перейдя в коллекции (Collections) можно увидеть нашу базу. Изначально она будет пустой и будет предложено создать новую базу и первую коллекцию в базе. Создаём.
Установка модуля и полезные ссылки
Теперь нужно установить MongoDB модуль в А-Парсере.
Код:
npm install mongodb
Полезные ссылки:
- Инструкция по установке дополнительных модулей в А-Парсер.
- Документация работы на Node.js с MongoDB
- Node.js MongoDB Driver API
Подключение к базе
Теперь создаем в А-Парсере новый 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}`);
}
Как это выглядит в логе А-Парсера:
Как это выглядит в 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