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)
freakru
27.05.2016 15:20Один из главных минусов — она не поддерживает aggregation framework. Стоит это учитывать при выборе базы данных. А для простейших вещей она подходит идеально.
AStek
27.05.2016 16:44+3Посмотрел исходники. Я ошибаюсь или оно всё хранит в текстовых файлах? Если так то сравнивать его с SQLite как-то самонадеяно имхо.
(Ну да, индексы вроде ин-мемори)))
Finom
27.05.2016 17:55+2Пост был бы намного полезнее, если бы не заставлял устанавливать СУБД себе на комп, и результат транзакций (содержимое json файла) можно было бы изучить прямо из статьи.
dezconnect
27.05.2016 18:05-6С названием немного промахнулись, надо было более честно NedoDB назвать ;)
Alexey2005
27.05.2016 20:25Если эта БД запускается в браузере, возможно ли получить ссылку на её бинарный блоб, чтоб сохранить его на машине пользователя в виде файла? И наоборот, возможно ли передать в конструктор загруженный блоб, чтоб «развернуть» его в БД?
Flaksirus
Звголовок желтоват, создает впечатление, что NeDB — это просто обертка над SQLite, когда никакой связи с ним нет. Это скорее некоторый MongoDBLite… Но, да я понимаю, что заголовок из официального описания.
Но база интересная, спасибо. Жаль, что только для ноды…
gibson_dev
Не только, для всего что умеет интерпритировать JavaScript
Eternalko
MongoDBLite done right :)
Более года пользую. Хорошая, mongo-compatible база данных. Умеет работать в режиме in-memory так и на файлах.
Удобно использовать как подручный кэш.
Еще больше люблю LokiJs. Отличная, хорошо себя показывает на фронтенде. Все остальные слились.
Есть forerunnerdb, но я ее не трогал еще.
Если у вас хороший devops, то можно безопасно ставить mongo в режиме in-memory на каждой ноде приложения :)