我需要在我的应用程序中永久存储一些数据,到目前为止我一直在使用MongoDB,但是对于我的目的而言似乎有点过分。所以我正在寻找一个更简单的选择:
有很多不同的解决方案,但我没有找到满足我所有要求的解决方案。我能找到的大多数JSON数据库只是用于客户端,似乎没有任何支持将数据(异步)存储到磁盘。
你能推荐一个解决方案吗?
答案 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;