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

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
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
 
Категория
Полезно
Номер конкурса шаблонов
Шестой конкурс шаблонов

Вложения

Последнее редактирование:

vrska

Client
Регистрация
07.02.2010
Сообщения
576
Благодарностей
395
Баллы
63
Mongodb на минималках, не нуждающаяся в конфигурации. Хорошая замена SQLite
 

radv

Client
Регистрация
11.05.2015
Сообщения
1 771
Благодарностей
962
Баллы
113

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
Например от Sqlite и MySql.
Главное отличие в формате данных, перечисленные используют таблицы, а NoSQL использует коллекции. На примере парсинга это выглядит следующим образом, предположим, мы хотим спарсить yandex маркет. В нем есть раздел холодильников и кондиционеров. Для каждого из этих товаров есть свой набор свойств и их названий.

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

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

LiteDB Explorer 2020-09-09 06.35.51.png

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

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

- Из-за своей структуры и наличия _id, достигается отличная оптимизация.
 

Bullet

Client
Регистрация
16.12.2015
Сообщения
185
Благодарностей
21
Баллы
18

radv

Client
Регистрация
11.05.2015
Сообщения
1 771
Благодарностей
962
Баллы
113
В случае с SQL базами, нам пришлось бы создвать отдельную таблицу для каждой группы товара, в каждой был бы уникальный и статичный набор столбцов с названиями свойств этих товаров.

Для NoSQL, нет необходимости так делать
Это супер, как и то что инфа в файл сохраняется. :ay:
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 311
Благодарностей
1 000
Баллы
113
В случае с SQL базами, нам пришлось бы создвать отдельную таблицу для каждой группы товара, в каждой был бы уникальный и статичный набор столбцов с названиями свойств этих товаров.
Нет, не пришлось бы .... для реализации хранения разных свойств разных товаров в реляционных БД используется модель Entity–attribute–value ( она же просто EAV ). Другое дело что NoSQL БД типа mongo или как я понимаю рассмотренный вами LiteDB для этого действительно удобнее использовать .....
 
  • Спасибо
Реакции: RoyalBank и radv

ulLite

Client
Регистрация
24.03.2019
Сообщения
69
Благодарностей
20
Баллы
8
то есть если спарсить в json и потом можно в эту LiteDB отправить данные json?
 

ulLite

Client
Регистрация
24.03.2019
Сообщения
69
Благодарностей
20
Баллы
8
Посмотрел шаб,мало что понятно.
Инструкции нет как пользоваться. Видео бы не помешало как пользоваться этим шаблоном.
 

vrska

Client
Регистрация
07.02.2010
Сообщения
576
Благодарностей
395
Баллы
63

ulLite

Client
Регистрация
24.03.2019
Сообщения
69
Благодарностей
20
Баллы
8
Если ты такой умник и все знаешь,то пройди мимо,и не надо мне скидывать ссылки на документацию к БД, это мне ни о чем не говорит.

Конкурс о шаблонах,если создали шаб,то нужна инструкция как и что делать.
 
  • Спасибо
Реакции: Андрейка2020

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
Посмотрел шаб,мало что понятно.
Можешь следовать следующему порядку действий:
  • Закидываешь библиотеку в ExternalAssemblies;
  • Выполняешь кубик "Формат записи № 1/2/3";
  • Смотришь в базу, какой результат записан;
  • Смотришь, что в коде;
  • По аналогии делаешь для своего проекта.
 

Lite

Client
Регистрация
17.10.2013
Сообщения
265
Благодарностей
74
Баллы
28
- Можно хранить массивы, предположим, мы собираем базу фильмов сериалов, где актерский состав отличается по количеству. В нашем случае, нам это не важно, т.к. любое количество актеров будет сохранено в один массив.
А потом можно будет делать запросы вида "найти фильм, в котором были актерА и актерБ", или "найти все фильмы актераБ"?
Помню, что в универе с mysql всё это делали через разные таблицы, и связи один ко многим, многие ко многим (в которых я постоянно путался).
 

ulLite

Client
Регистрация
24.03.2019
Сообщения
69
Благодарностей
20
Баллы
8
Эта тема хороша,но не раскрыта инструкция. По условию конкурса,надо чтобы было подробно описано как пользоваться.
У тебя краткая инструкция, это значит тема не для новичков или для тех кто хочет познать базы данных. Скорее для тех кто уже в БД работает долгое время и понятна суть работы.

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

На скриншотах ты раскрыл как парсил в БД "звездные войны" по всем переменным. Неплохо было бы и шаблон прислать как спарсил сайт.
 
  • Спасибо
Реакции: Roman48

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
А потом можно будет делать запросы вида "найти фильм, в котором были актерА и актерБ", или "найти все фильмы актераБ"?
Конечно, в библиотеке весь необходимый функционал:
  • 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 не умеет работать с массивами, поэтому лучше использовать псевдо массивы.
 

ulLite

Client
Регистрация
24.03.2019
Сообщения
69
Благодарностей
20
Баллы
8
Спасибо,вот уже намного лучше понятие работы для парсинга.
 

qwerty123

Client
Регистрация
26.02.2019
Сообщения
98
Благодарностей
23
Баллы
18
подскажи а есть простой метод как делать проверку на дубли ? так как сайт не выдает инфу по категориями тд, а нужно делать поиск и часто результаты поиска пересекаются, какбы так делать проверку перед записью ? заранее спасибо
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
Как вариант, использовать 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

temass

Client
Регистрация
06.06.2015
Сообщения
86
Благодарностей
1
Баллы
8
Всем привет друзья,выдает такую ошибку Cannot insert duplicate key in unique index '_id'. Что неправильно делаю? Сами id я вроде не указываю никак

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

 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
Привет, нужно видеть запрос, который отправляешь в базу. По умолчанию id генерируются из ObjectId и он не может никак повториться в базе.
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
163
Благодарностей
85
Баллы
28
Про ограничения не написал :-)
+ за поддержку линков на файлы, но ограничения в моем случае критично не вписываются

Но в целом либа достойная
 

emel

Client
Регистрация
21.02.2015
Сообщения
85
Благодарностей
17
Баллы
8
Интересная вещь. А видео нет как JSON в неё запихнуть? С неизвестным числом характеристик и без всяких обработок.
 

emel

Client
Регистрация
21.02.2015
Сообщения
85
Благодарностей
17
Баллы
8
Или такое нереально.
 
Регистрация
05.06.2019
Сообщения
491
Благодарностей
367
Баллы
63
Привет, нужно видеть запрос, который отправляешь в базу. По умолчанию id генерируются из ObjectId и он не может никак повториться в базе.
Приветствую! Подскажите пожалуйста, как я понял, нет возможности добавить данные в существующую запись?

Создал запись с примерной структурой:
JavaScript:
{
    "_id": "1",
    "Comments":
    [
        {
            "$id": "1",
            "$ref": "comment"
        }
    ]
}
Пробовал уже связать две коллекции (по сути таблицы), но, что-то кажется криво.
По сути, нужно, добавлять данные в "Comments", в определенный _id.
 
Регистрация
05.06.2019
Сообщения
491
Благодарностей
367
Баллы
63
Нельзя пост редактировать, поправлю:

2 таблицы:
1) Товар_ID
- содержит массив ID комментариев.
2) Комментарий_ID
- содержит подробную информацию об комментарии к товару по ID.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
437
Благодарностей
406
Баллы
63
Приветствую!
LiteDB поддерживает api стандартных sql запросов, в том числе "INSERT".
Либо, как вариант, можно через Object Mapping, разобрать объект в класс, отредактировать его, и сохранить отредактированным, через update.
 

Viking01

Client
Регистрация
19.08.2017
Сообщения
107
Благодарностей
18
Баллы
18
Интересная мысль
noSql базу прикрутить...
Правильно понимаю, она все пишет в один файл? то есть будет ограничение на макс размер?
ну там если данных на 10-20 гб...
 

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