Nedb非唯一_id索引

时间:2018-09-19 07:22:27

标签: database electron nedb

我有一个针对我的electronic.js应用程序的Nedb数据库,即使使用ensureIndex({… unique: true})也会生成_id副本。 Onclick时,索引值将增加5-而是使用该值生成新索引。示例:

// Before click
{"_id":0,"testVal":0}
{"_id":1,"testVal":0}
{"_id":2,"testVal":0}
…
// After click
{"_id":0,"testVal":0} // Intended: {"_id":0, "testVal":5}
{"_id":1,"testVal":0}
{"_id":2,"testVal":0}
…
{"_id":0,"testVal":5}

相关代码:

var Datastore = require('nedb'); 
db = new Datastore ({filename: 'db/rtest.db', autoload: true}); 

// Database functions
exports.createTestVal = function(i, passVal) {
  var test = {_id: i, testVal: passVal};
  db.insert(test, function(err, newDoc){})};

exports.updateTestVal = function(i, passVal) {
db.update({_id: i}, {$set: {"testVal": passVal}}, {}, function(err, numReplaced){});}

exports.getTestVal = function(fnc){
  db.find({}, function(err, docs) {fnc(docs)})}

exports.deleteTestVal = function(id) {
  db.remove({_id: id}, {}, function(err, numRemoved){})}

// Event functions
const database = require('../assets/js/testdatabase'); // 'testdatabase' = code above

var btnTst = document.getElementById('add5'); var i = 0;
db.ensureIndex({ fieldName: "_id", unique: true }, function (err) {});

btnTst.addEventListener('click', function(event){
  var value = Number(this.value);
  database.updateTestVal(i, value);
  i++;})

window.addEventListener('load', function() {
    database.getTestVal(function(testVals) {
    for (k = 0; k < 10; k++) {if (testVals.length == k){fillValues(k)}}})})  

function fillValues(k){for (p = k; p < 10; p++){database.createTestVal(p, 0)}}
<button id="add5" value=5>+5</button>

尝试修改变量类型,重新排序函数等-无济于事。 GitHub documentation声称_id默认情况下是唯一索引的,但在我的使用中并非如此。

有什么解决方法吗?

1 个答案:

答案 0 :(得分:1)

假设您在查看正在写入数据库的物理文件时看到这些“重复项”,那么一切都按预期工作。

来自NeDB documentation

  

持久性

     

在后台,NeDB的持久性使用仅追加格式,这意味着出于性能原因,所有更新和删除实际上都会在数据文件的末尾添加行。每次在应用程序中加载每个数据库时,数据库都会自动压缩(即以每文档一行的格式返回)。

相关问题