Nedb неуникальное индексирование _id - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть база данных Nedb для моего приложения Electron.js, которое генерирует реплики _id даже с ensureIndex({… unique: true}).При щелчке индексированное значение увеличивается на 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 утверждается, что _id уникально индексируется по умолчанию, но в моем использовании это не так.

Какие-нибудь обходные пути?

1 Ответ

0 голосов
/ 19 сентября 2018

Предполагая, что вы видите эти "дубликаты" при просмотре физического файла, в который записывается ваша база данных, все работает должным образом.

Из документации NeDB :

Постоянство

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

...