我有一个针对我的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
默认情况下是唯一索引的,但在我的使用中并非如此。
有什么解决方法吗?
答案 0 :(得分:1)
假设您在查看正在写入数据库的物理文件时看到这些“重复项”,那么一切都按预期工作。
持久性
在后台,NeDB的持久性使用仅追加格式,这意味着出于性能原因,所有更新和删除实际上都会在数据文件的末尾添加行。每次在应用程序中加载每个数据库时,数据库都会自动压缩(即以每文档一行的格式返回)。