2016-05-29 1 views
0

Я хочу иметь точно автоинкрементируемое поле как реляционные или объективные базы данных, так что мне нужно поле целого _id с автоматически устанавливаются значением поля, значение должно быть больше одна последней записью _id значения, как это:Как я могу использовать auto-increment field в nedb?

данные:

{_id:1,name"foo"} 
{_id:2,name"bar"} 

удалить последняя запись:

{_id:1,name"foo"} 

добавить новую запись:

{_id:1,name"foo"} 
{_id:3,name"newbar"} 

Я добавил функцию к моему датасторе и вычислить максимум _id и плюс 1 max(_id)+1 и установить в качестве значения поля, но есть проблема:

Когда мы используем поле автоинкрементируемого в реляционных базах данных, он работает как я сказал, и после вас remove last record он зарезервировал номер удаленной записи, а новые вставленные записи продолжают увеличиваться, но в моем случае он говорит _id удаленной записи для новой записи.

Мой код:

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

localDb.getMax = function(fieldName, onFind){ 
    db.find({}).sort({_id:-1}).limit(1).exec(function (err, docs) {onFind && onFind(err, docs['_id']);}); 
    return localDb; 
} 

localDb.insertAutoId = function(data, onAdd){ 
    var newIndex = 0; 
    localDb.getMax(function (err, maxValue) { 
     newIndex = maxValue+1; 

     if(!data["_id"]) 
      data["_id"] = newIndex; 

     localDb.insert(data, function (err, newDoc) { 
      onAdd && onAdd(err, newDoc); 
     }); 
    }); 
    return localDb; 
} 

ответ

2

Вы можете сохранить последнее значение индекса в базе данных. Что-то вроде этого:

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

// Initialize the initial index value 
// (if it already exists in the database, it is not overwritten) 
db.insert({_id: '__autoid__', value: -1}); 

db.getAutoId = function(onFind) { 
    db.findOne({ _id: '__autoid__' }, function(err, doc) { 
    if (err) { 
     onFind && onFind(err) 
    } else { 
     // Update and returns the index value 
     db.update({ _id: '__autoid__'}, { $set: {value: ++doc.value} }, {}, 
     function(err, count) { 
      onFind && onFind(err, doc.value); 
     }); 
    } 
    }); 
    return db; 
} 
2

Усовершенствованный ответ на nedb будет:

db.getAutoincrementId = function (cb) { 
    this.update(
     { _id: '__autoid__' }, 
     { $inc: { seq: 1 } }, 
     { upsert: true, returnUpdatedDocs: true }, 
     function (err, affected, autoid) { 
      cb && cb(err, autoid.seq); 
     } 
    ); 
    return this; 
}; 

Что эквивалентно MongoDB образом:

db.getAutoincrementId = function (cb) { 
    this.findAndModify({ 
      query: { _id: '__autoid__' }, 
      update: { $inc: { seq: 1 } }, 
      new: true 
     } 
     function (err, autoid) { 
      cb && cb(err, autoid.seq); 
     } 
    ); 
    return this; 
}; 
1

Я не знаю, если это будет полезно для вас, я использую базу данных для хранения следующих идентификаторов, вдохновленных системой mysql. Кто всегда резервирует следующий идентификатор. Итак, я создал функцию, которая проверяет, есть ли идентификатор для db, если это не так, оно добавляет значение «1», а когда оно обновляется, оно ищет и, если оно существует, и выполняет последовательность. Это дало мне полный контроль над моими идентификаторами. Схема будет:

{ 
name: nameDb, 
nextId: itemID 
} 

Если вы хотите, вы можете создавать функции для обновления документов, управление версиями и т.д.

пример:

db.autoincrement = new Datastore({filename: 'data/autoincrement.db', autoload: true}); 

function getUniqueId(nameDb, cb) { 
    db.autoincrement.findOne({name: nameDb}, function (err, doc) { 
     if (err) { 
      throw err; 
     } else { 
      if (doc) { 
       const itemID = doc.nextId + 1; 
       db.autoincrement.update({name: nameDb}, { 
        name: nameDb, 
        nextId: itemID 
       }, {}, function (err, numReplaced) { 
        db.autoincrement.persistence.compactDatafile(); 
        if (err) { 
         throw err; 
        } else { 
         // console.log(numReplaced); 
        } 
        cb(doc.nextId); 
       }); 
      } else { 
       const data = { 
        name: nameDb, 
        nextId: 2 
       }; 

       db.autoincrement.insert(data, function (err, newDoc) { 
        if (err) { 
         throw err; 
        } else { 
         // console.log(newDoc); 
        } 
        cb(1); 
       }); 
      } 
     } 

    }); 
} 

вставка новый пример документа:

 function insert(req, cb) { 
     getUniqueId("testdb", function (uniqueId) { 
      data.itemId = uniqueId; 

      db.testdb.insert(data, function (err, newDoc) { 
       if (err) { 
        cb({error: '1', message: 'error#2'}); 
        throw err; 
       } 
       cb({error: '0', message: 'Item add'}); 
      }); 

     }); 
     }