我如何在nedb中有自动递增字段?

Meh*_*neh 2 nosql node.js nedb

我想要像关系数据库或目标数据库那样具有完全自动递增的字段,因此我需要一个_id具有自动设置的字段值的整数字段,值应该是这样的最后一个记录_id值:

数据:

{_id:1,name"foo"}
{_id:2,name"bar"}
Run Code Online (Sandbox Code Playgroud)

删除最后一条记录:

{_id:1,name"foo"}
Run Code Online (Sandbox Code Playgroud)

添加新记录:

{_id:1,name"foo"}
{_id:3,name"newbar"}
Run Code Online (Sandbox Code Playgroud)

我向数据存储区添加了一个函数,并计算_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;
}
Run Code Online (Sandbox Code Playgroud)

dan*_*ndi 5

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;
};
Run Code Online (Sandbox Code Playgroud)

这等效于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;
};
Run Code Online (Sandbox Code Playgroud)