Более простая альтернатива MongoDB / базы данных для узла

Мне нужно постоянно хранить некоторые данные в моем приложении, и до сих пор я играл с MongoDB, который, однако, кажется немного излишним для моих целей. Поэтому я ищу более простую альтернативу:

  • Простая настройка; Я бы предпочел, чтобы хранилище было простым (JSON) файлом. Что мне особенно не нравится в Mongo, так это то, что он должен быть отдельно установлен и настроен.
  • Только одно приложение будет иметь доступ к базе данных в один момент; нет необходимости в синхронизации или управлении доступом (вся база данных может храниться в памяти и записываться на диск только при возникновении изменений)
  • Это должно быть асинхронно (это Node, верно...)
  • Было бы неплохо выполнить некоторые базовые запросы и фильтрацию данных (например, поиск в коллекциях, получение элементов по идентификатору и т. Д.)

Вокруг много разных решений, но я не нашел такого, который бы отвечал всем моим требованиям. Большинство баз данных JSON, которые мне удалось найти, просто предназначены для использования на стороне клиента, и, похоже, нет никакой поддержки для хранения данных (асинхронно) на диск.

Не могли бы вы порекомендовать решение?

1 ответ

После некоторых дальнейших поисков я обнаружил склад, который, кажется, подходит для моих пурпуров. Он имеет приятный монго-подобный API и поддерживает запись и загрузку из файла. Документация лаконична и немного устарела, но из модульных тестов можно узнать все, что ему нужно.

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

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

Примерно так выглядит мой модуль обработки базы данных:

var fs = require('fs');
var warehouse = require('warehouse');
var debug = require('debug')('db');
var _ = require('lodash');

function load() {
    db.load().then(function () {
        debug('Database loaded');
    })
}

// The promise will guarantee atomicity of writes to the disk so the database
// file will not get corrupted (as long as only one instance of this program is
// running at a time)
var savingPromise;
function save() {
    if (!savingPromise) {
        savingPromise = db.save();
    } else {
        savingPromise = savingPromise.then(db.save.bind(db));
    }
    savingPromise.then(function () {
        debug('Database saved');
    });
}

var databaseFile = 'database.json';
var db = new warehouse({path: databaseFile});
if (fs.existsSync(databaseFile)) {
    load();
}

var models = {
    Model1: db.model('model1', Model1Schema),
    Model2: db.model('model2', Model2Schema),
    Model3: db.model('model3', Model3Schema)
};

// Debouncing the save function ensures that if more than one change
// occur in a short period of time, they all will be saved with 
// in a single write to the disk. (Saving each change individually would
// significantly reduce the performance.)
var delayedSave = _.debounce(save, 1000);
_.each(models, function (model) {
    model.addListener('insert', delayedSave);
    model.addListener('update', delayedSave);
    model.addListener('remove', delayedSave);
});

module.exports = models;
Другие вопросы по тегам