Проект для работы с LiteDB. Удобная NoSQL база для парсинга.

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Реакции
555
Баллы
93
banner-logo.png



Приветствую всех!

В шаблоне примеры сниппетов для сохранения информации в базу. Используется версия 4.1.4, т.к. под эту линейку написан explorer с хорошим UI и функционалом.

Порядок действий:
  1. Добавить в папку ExternalAssemblies файлы: LiteDB.dll и LiteDB.xml
  2. Прописать в директивы using:
    C#:
    Развернуть Свернуть Копировать
    using LiteDB;
  3. Добавить LiteDB.dll из папки ExternalAssemblies в "Ссылки из GAC".

Краткий экскурс в JSON формат.
Все что вам нужно знать о JSON - это разница между фигурными {} и квадратными [] скобками. :-)

Фигурные скобки {} - это документ или объект, которому должно быть присвоено имя. Документ может включать документы, массивы и т.д.
JavaScript:
Развернуть Свернуть Копировать
{
    "name_1": "value_1",
    "name_2": "value_2"
}

Квадратные скобки [] - это массив объектов (array).
JavaScript:
Развернуть Свернуть Копировать
[
    "value_1",
    "value_2"
]

Это позволяет создавать структуры любой сложности и вложенности, а затем просто отправлять их в базу. Таким образом нет необходимости заранее планировать структуру базы, нет необходимости подключаться к базе или держать локальный сервер. Информация хранится в одном файле.

В базе используется BSON, который расширяет поддержку форматов для JSON, поддерживаются ObjectID, Date, и т.д.

Для экспорта и работы с информацией используем LiteDbExplorer, позволяет работать с несколькими базами сразу, экспортировать в excel, csv и json.

start_dark.png
list_dark.png
query_dark.png
edit_dark.png
 
Номер конкурса шаблонов
  1. Шестой конкурс шаблонов
Уровень сложности
Продвинутый
Категория
  1. Полезно

Вложения

Последнее редактирование:
Mongodb на минималках, не нуждающаяся в конфигурации. Хорошая замена SQLite
 
Например от Sqlite и MySql.
Главное отличие в формате данных, перечисленные используют таблицы, а NoSQL использует коллекции. На примере парсинга это выглядит следующим образом, предположим, мы хотим спарсить yandex маркет. В нем есть раздел холодильников и кондиционеров. Для каждого из этих товаров есть свой набор свойств и их названий.

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

Для NoSQL, нет необходимости так делать, мы можем создать одну коллеекцию "Appliances", в которую будем отправлять холодильники, кондиционеры, микроволновки, кофеварки и т.д. И разность свойств и их названий не будет ломать структуру. Если какой-то столбец относится только к холодильникам в табличной структуре он будет для остальных значений давайть null. На скриншоте можно обратить внимание, что 4 и 5 столбцы могут быть null, тоже самое для объектов внутри документов.

LiteDB Explorer 2020-09-09 06.35.51.png

- Можно хранить массивы, предположим, мы собираем базу фильмов сериалов, где актерский состав отличается по количеству. В нашем случае, нам это не важно, т.к. любое количество актеров будет сохранено в один массив.

- База сохраняется в файле, как в случае с SQLite, и нам нет необходимости поднимать и подключать сервер.

- Из-за своей структуры и наличия _id, достигается отличная оптимизация.
 
В случае с SQL базами, нам пришлось бы создвать отдельную таблицу для каждой группы товара, в каждой был бы уникальный и статичный набор столбцов с названиями свойств этих товаров.

Для NoSQL, нет необходимости так делать
Это супер, как и то что инфа в файл сохраняется. :ay:
 
В случае с SQL базами, нам пришлось бы создвать отдельную таблицу для каждой группы товара, в каждой был бы уникальный и статичный набор столбцов с названиями свойств этих товаров.
Нет, не пришлось бы .... для реализации хранения разных свойств разных товаров в реляционных БД используется модель Entity–attribute–value ( она же просто EAV ). Другое дело что NoSQL БД типа mongo или как я понимаю рассмотренный вами LiteDB для этого действительно удобнее использовать .....
 
  • Спасибо
Реакции: RoyalBank и radv
то есть если спарсить в json и потом можно в эту LiteDB отправить данные json?
 
Посмотрел шаб,мало что понятно.
Инструкции нет как пользоваться. Видео бы не помешало как пользоваться этим шаблоном.
 
Если ты такой умник и все знаешь,то пройди мимо,и не надо мне скидывать ссылки на документацию к БД, это мне ни о чем не говорит.

Конкурс о шаблонах,если создали шаб,то нужна инструкция как и что делать.
 
Посмотрел шаб,мало что понятно.
Можешь следовать следующему порядку действий:
  • Закидываешь библиотеку в ExternalAssemblies;
  • Выполняешь кубик "Формат записи № 1/2/3";
  • Смотришь в базу, какой результат записан;
  • Смотришь, что в коде;
  • По аналогии делаешь для своего проекта.
 
- Можно хранить массивы, предположим, мы собираем базу фильмов сериалов, где актерский состав отличается по количеству. В нашем случае, нам это не важно, т.к. любое количество актеров будет сохранено в один массив.
А потом можно будет делать запросы вида "найти фильм, в котором были актерА и актерБ", или "найти все фильмы актераБ"?
Помню, что в универе с mysql всё это делали через разные таблицы, и связи один ко многим, многие ко многим (в которых я постоянно путался).
 
Эта тема хороша,но не раскрыта инструкция. По условию конкурса,надо чтобы было подробно описано как пользоваться.
У тебя краткая инструкция, это значит тема не для новичков или для тех кто хочет познать базы данных. Скорее для тех кто уже в БД работает долгое время и понятна суть работы.

В кубике-код,только шаблоны-примеры заполнения. Но никаких переменных нет,получается не понять будет как парсить любой сайт.

На скриншотах ты раскрыл как парсил в БД "звездные войны" по всем переменным. Неплохо было бы и шаблон прислать как спарсил сайт.
 
  • Спасибо
Реакции: Roman48
А потом можно будет делать запросы вида "найти фильм, в котором были актерА и актерБ", или "найти все фильмы актераБ"?
Конечно, в библиотеке весь необходимый функционал:
  • API, как у mongo, если работал с mysql, то никаких сложностей не должно возникнуть.
  • Наличие LINQ + полностью на C#.
Но никаких переменных нет,получается не понять будет как парсить любой сайт.
Все очень просто! Ты, когда парсишь любой сайт, ты раскидываешь информацию по переменным и, возможно, делаешь условный цикл, если нужно собрать несколько товаров. Ну либо только один товар, если ты обращаешься напрямую по ссылке на страницу.

В этом случае, ты добавляешь в конце кубиков/цикла, когда собрал данные со страницы кубик с кодом:

C#:
Развернуть Свернуть Копировать
// Объявляем объект для lock'a
object NoSQL = new object();

// Объявляем документ, который будем сохранять в базу.
BsonDocument bd = new BsonDocument
{
    { "name",  project.Variables["character_name"].Value },
    { "rotation_period",  project.Variables["rotation_period"].Value  },
    { "orbital_period",  project.Variables["orbital_period"].Value  },
    { "diamert",  project.Variables["diamert"].Value  },
    { "climate",  project.Variables["climate"].Value  },
    { "gravity",  project.Variables["gravity"].Value  }
};

// Отправляем результат в базу данных
lock(NoSQL)
{
    using(var db = new LiteDatabase(Path.Combine(project.Directory, @"db_name.db")))
    {
        var col = db.GetCollection("table_name");
        col.Insert(bd);
    }
}

Таким образом твой результат будет сохранен в базу данных, и дальше ты уводишь на следующий цикл, либо завершаешь работу если один повтор работает только с одной страницей.
Конечно же, тебе необходимо составить твой документ, ты можешь сделать это, как показанно выше, либо использовать другой удобный метод записи. В случае если у тебя условная простыня кода и данные в документ добавляются походу работы этого кода, также в простыне можешь использовать List<>, для сбора информации в цикле и отправлять в базу уже сам список. Если же ты используешь кубики, то просто выставь последним кубиком код отправки в базу данных и результат будет сохранен. Затем открываешь базу эксплорером и экпортируешь в excel, либо экспортируешь в JSON в случае если у тебя вложенные документы и импортирешь в excel уже JSON файл. Единственный момент, excel не умеет работать с массивами, поэтому лучше использовать псевдо массивы.
 
Спасибо,вот уже намного лучше понятие работы для парсинга.
 
подскажи а есть простой метод как делать проверку на дубли ? так как сайт не выдает инфу по категориями тд, а нужно делать поиск и часто результаты поиска пересекаются, какбы так делать проверку перед записью ? заранее спасибо
 
Как вариант, использовать Queries.

Тут подробное описание: https://github.com/mbdavid/LiteDB/wiki/Queries

C#:
Развернуть Свернуть Копировать
lock(NoSQL)
{
    using(var db = new LiteDatabase(Path.Combine(project.Directory, @"db_name.db")))
    {
        var col = db.GetCollection("list_array");

        // Проверяем если в базе есть документ {"proxy": "192.168.0.5"}
        var results = col.Exists(Query.EQ("proxy", "192.168.0.5"));
        
        if (results) project.SendInfoToLog("Нашли совпадения", true);
        else project.SendInfoToLog("Нет совпадений", true);

    }
}
 
  • Спасибо
Реакции: qwerty123
Всем привет друзья,выдает такую ошибку Cannot insert duplicate key in unique index '_id'. Что неправильно делаю? Сами id я вроде не указываю никак

таблица большая, там инфа идет по годам и 1 кампания условно собирается несколько раз, за каждый год инфа

 
Привет, нужно видеть запрос, который отправляешь в базу. По умолчанию id генерируются из ObjectId и он не может никак повториться в базе.
 
Про ограничения не написал :)
+ за поддержку линков на файлы, но ограничения в моем случае критично не вписываются

Но в целом либа достойная
 
Интересная вещь. А видео нет как JSON в неё запихнуть? С неизвестным числом характеристик и без всяких обработок.
 
Или такое нереально.
 
Привет, нужно видеть запрос, который отправляешь в базу. По умолчанию id генерируются из ObjectId и он не может никак повториться в базе.

Приветствую! Подскажите пожалуйста, как я понял, нет возможности добавить данные в существующую запись?

Создал запись с примерной структурой:
JavaScript:
Развернуть Свернуть Копировать
{
    "_id": "1",
    "Comments":
    [
        {
            "$id": "1",
            "$ref": "comment"
        }
    ]
}

Пробовал уже связать две коллекции (по сути таблицы), но, что-то кажется криво.
По сути, нужно, добавлять данные в "Comments", в определенный _id.
 
Нельзя пост редактировать, поправлю:

2 таблицы:
1) Товар_ID
- содержит массив ID комментариев.
2) Комментарий_ID
- содержит подробную информацию об комментарии к товару по ID.
 
Приветствую!
LiteDB поддерживает api стандартных sql запросов, в том числе "INSERT".
Либо, как вариант, можно через Object Mapping, разобрать объект в класс, отредактировать его, и сохранить отредактированным, через update.
 
Интересная мысль
noSql базу прикрутить...
Правильно понимаю, она все пишет в один файл? то есть будет ограничение на макс размер?
ну там если данных на 10-20 гб...
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)