NeDB: аналог SQLite для NodeJS



    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.
    Share post

    Comments 10

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

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

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

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

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

              +2
              Я лишь сказал что AF не поддерживается, а нужен он или нет — решайте сами. Для меня было важно не городить огород с собственными велосипедами для выборки данных.
            +3
            Посмотрел исходники. Я ошибаюсь или оно всё хранит в текстовых файлах? Если так то сравнивать его с SQLite как-то самонадеяно имхо.
            (Ну да, индексы вроде ин-мемори)))
              +2

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

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

                  Only users with full accounts can post comments. Log in, please.