NeDB (Node.js Embedded Database) — встраиваемая база данных для NodeJS, реализующая подмножество MongoDB API. Эта легкая NoSQL СУБД написана на чистом JavaScript, не имеет бинарных зависимостей и, помимо NodeJS, может использоваться в NW.js, Electron или прямо в браузере.
NeDB обеспечивает хранение данных в простом файле на диске в json-формате, который похож на коллекции в MongoDB.

Установка


NeDB доступен из bower и npm:
npm install nedb --save

Давайте создадим хранилище данных под названием «users»:
var Datastore = require('nedb');
var db = new Datastore({filename : 'users'});
db.loadDatabase();

Это создаст файл с именем users в вашем рабочем каталоге. Если вы хотите использовать NeDB для хранения в памяти, вам необходимо использовать конструктор без параметров, т.е. не передавать ему имя файла.

CRUD


Давайте вставим запись:
db.insert({name : "Boris the Blade", year: 1946});

Откройте файл users, чтобы увидеть вставленный объект. NeDB автоматически добавляет поле "_id" для каждого объекта. Чтобы вставить более одной записи, передайте массив в метод insert. Такая операция является атомарной, так что если одна из вставок потерпит неудачу, для другой будет выполнен откат.

Извлечение данных:
db.find({year: 1946}, function (err, docs) {
	console.log(docs);
});

Этот метод принимает запрос в виде объекта и функцию обратного вызова; docs представляет собой массив, содержащий результаты поиска. В данном примере мы просто выведем этот массив в консоль.

Обновление данных:
Для обновления данных вам нужно передать три аргумента:
— запрос для поиска документа, который нужно изменить;
— объект для замены;
— параметры замены (их мы оставим пустыми – {}).
db.update({year: 1946}, {name: "Doug the Head", year: 1940}, {});

Выполните запрос и посмотрите на файл users. Замечаете нечто необычное? Первая запись (Бориса Бритвы) до сих пор в файле. Это происходит из-за механики NeDB, которая считает, что не стоит тратит время на переписывание записей. NeDB просто добавляет новые строки. То же самое касается операции удаления:
db.remove({year: 1946}, {});

Индексация


NeDB поддерживает индексы почти как в Mongo:
db.ensureIndex({fieldName: 'year'});

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

Скорость


NeDB не предназначен для того, чтобы заменить крупномасштабные базы данных, такие как MongoDB. Тем не менее, база работает довольно быстро на ожидаемых наборах данных, особенно после индексации. Документация утверждает, что «на обычной, не-очень-быстрой dev-машине» для коллекции из 10,000 документов NeDB показывает:
Вставка: 10,680 ops/s
Поиск: 43,290 ops/s
Обновление: 8,000 ops/s
Удаление: 11,750 ops/s
Чуть более точные сравнительные тесты производительности NeDB против MongoDB, Tingodb и EJDB.

Вот и все. Только что вы познакомились с NeDB.
Поделиться с друзьями
-->

Комментарии (10)


  1. Flaksirus
    27.05.2016 12:41
    +5

    Звголовок желтоват, создает впечатление, что NeDB — это просто обертка над SQLite, когда никакой связи с ним нет. Это скорее некоторый MongoDBLite… Но, да я понимаю, что заголовок из официального описания.
    Но база интересная, спасибо. Жаль, что только для ноды…


    1. gibson_dev
      27.05.2016 13:49

      Не только, для всего что умеет интерпритировать JavaScript


    1. Eternalko
      28.05.2016 12:16

      MongoDBLite done right :)

      Более года пользую. Хорошая, mongo-compatible база данных. Умеет работать в режиме in-memory так и на файлах.
      Удобно использовать как подручный кэш.
      Еще больше люблю LokiJs. Отличная, хорошо себя показывает на фронтенде. Все остальные слились.
      Есть forerunnerdb, но я ее не трогал еще.

      Если у вас хороший devops, то можно безопасно ставить mongo в режиме in-memory на каждой ноде приложения :)


  1. freakru
    27.05.2016 15:20

    Один из главных минусов — она не поддерживает aggregation framework. Стоит это учитывать при выборе базы данных. А для простейших вещей она подходит идеально.


    1. rumkin
      27.05.2016 15:39

      А какой смысл в AF для in-memory БД?


      1. freakru
        27.05.2016 16:00
        +2

        Я лишь сказал что AF не поддерживается, а нужен он или нет — решайте сами. Для меня было важно не городить огород с собственными велосипедами для выборки данных.


  1. AStek
    27.05.2016 16:44
    +3

    Посмотрел исходники. Я ошибаюсь или оно всё хранит в текстовых файлах? Если так то сравнивать его с SQLite как-то самонадеяно имхо.
    (Ну да, индексы вроде ин-мемори)))


  1. Finom
    27.05.2016 17:55
    +2

    Пост был бы намного полезнее, если бы не заставлял устанавливать СУБД себе на комп, и результат транзакций (содержимое json файла) можно было бы изучить прямо из статьи.


  1. dezconnect
    27.05.2016 18:05
    -6

    С названием немного промахнулись, надо было более честно NedoDB назвать ;)


  1. Alexey2005
    27.05.2016 20:25

    Если эта БД запускается в браузере, возможно ли получить ссылку на её бинарный блоб, чтоб сохранить его на машине пользователя в виде файла? И наоборот, возможно ли передать в конструктор загруженный блоб, чтоб «развернуть» его в БД?