更简单的MongoDB /数据库替代节点

时间:2014-11-24 22:10:32

标签: json node.js storage

我需要在我的应用程序中永久存储一些数据,到目前为止我一直在使用MongoDB,但是对于我的目的而言似乎有点过分。所以我正在寻找一个更简单的选择:

  • 简易设置;我更喜欢存储只是一个简单的(JSON)文件。我特别不喜欢Mongo的是它必须单独安装和配置。
  • 只有一个应用程序会在一个时刻访问数据库;不需要同步或访问控制(整个数据库可以保存在内存中,只有在发生更改时才刷新到磁盘)
  • 它应该是异步的(它是Node,对......)
  • 对数据进行一些基本的查询和过滤会很不错(比如在集合中搜索,通过id检索项目等)。

有很多不同的解决方案,但我没有找到满足我所有要求的解决方案。我能找到的大多数JSON数据库只是用于客户端,似乎没有任何支持将数据(异步)存储到磁盘。

你能推荐一个解决方案吗?

1 个答案:

答案 0 :(得分:0)

经过一些进一步的搜索,我发现warehouse似乎对我的紫癜来说没问题。它有一个很好的类似mongo的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;