LokiJS:为索引插入现有值不会出错 - 如何制作唯一索引?

时间:2015-07-05 18:09:30

标签: indexing in-memory-database lokijs

如果我尝试覆盖现有的 indexed字段,我就不会收到错误消息。 它应该是错误的,因为它不是update()

var loki = require('lokijs');
var db = new loki('test.json');
var users = db.addCollection('users', { indices: ['userID']});
users.insert(
   {
     'name': 'Anna',
     'userID': 1
   },
   {
     'name': 'Bernd',
     'userID': 2
   },
   {
     'name': 'Christa',
     'userID': 3
   });
db.save();
users.insert({'name': 'Dieter','userID': 2}); // this should error!!

如何在尝试插入现有用户ID时创建唯一索引以获取错误?

2 个答案:

答案 0 :(得分:1)

indices选项在字段上创建索引,这样可以更快地检索,因为索引存在于集合中的单独排序数组中(因此Loki可以使用二进制搜索而不是完整循环来获取记录)。但是,您正在寻找使用ensureUniqueIndex创建的唯一索引(选中here,向下滚动到查找文档,有关于唯一索引的部分。)。有了它,您可以使用收集方法by(field, value)(如果只传递字段值,它甚至可以进行调整),它使用唯一索引来充分发挥潜力(大约是索引字段速度的2倍)。请记住,您需要显式调用ensureUniqueIndex,因为无法序列化和保留唯一索引。

更新:一旦调用了EnsureUniqueIndex方法,如果您尝试插入重复的密钥记录,该集合将抛出错误。如果您已检出存储库,则可以查看spec / generic / unique.spec.js以获取示例(here

答案 1 :(得分:0)

var loki = require('lokijs');
var db = new loki('test.json');
var users = db.addCollection('users', { indices: ['userID']});
users.ensureUniqueIndex('userID');

users.on('error',function(obj){
  console.log('error ... adding 1 to userID');
  obj.userID = obj.userID+1;
  return obj;
});
users.insert(
   {
     'name': 'Anna',
     'userID': 1
   });
users.insert(
    {
     'name': 'Bernd',
     'userID': 2
   });
users.insert(   
  {
     'name': 'Christa',
     'userID': 3
   });
db.save();
console.log(users.data);
try {
users.insert({'name': 'Dieter','userID': 2}); // this should error!!

} catch(e){
  var i = 2+1;
  users.insert({'name': 'Dieter','userID': i}); // this should error!!

}
db.save();
db2 = new loki('test.json');
db2.loadDatabase({}, function () {
  var users2 = db2.getCollection('users')
  console.log(users2.data);
});

users.on('error',...)try{ users.insert...} catch(e){// id+1}处理抛出的error

那是我的控制台:

[ { name: 'Anna',
    userID: 1,
    meta: { revision: 0, created: 1436186694342, version: 0 },
    '$loki': 1 },
  { name: 'Bernd',
    userID: 2,
    meta: { revision: 0, created: 1436186694342, version: 0 },
    '$loki': 2 },
  { name: 'Christa',
    userID: 3,
    meta: { revision: 0, created: 1436186694342, version: 0 },
    '$loki': 3 } ]
Duplicate key for property userID: 2
[ { name: 'Anna',
    userID: 1,
    meta: { revision: 0, created: 1436186694342, version: 0 },
    '$loki': 1 },
  { name: 'Bernd',
    userID: 2,
    meta: { revision: 0, created: 1436186694342, version: 0 },
    '$loki': 2 },
  { name: 'Christa',
    userID: 3,
    meta: { revision: 0, created: 1436186694342, version: 0 },
    '$loki': 3 },
  { name: 'Dieter',
    userID: 2,
    meta: { revision: 0, created: 0, version: 0 },
    '$loki': 4 } ]