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)
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)
| 归档时间: |
|
| 查看次数: |
2629 次 |
| 最近记录: |