【问题标题】:LokiJS: insert existing value for index doesn't error - how to make unique indices?LokiJS:为索引插入现有值不会出错 - 如何制作唯一索引?
【发布时间】:2015-07-05 18:09:30
【问题描述】:

如果我尝试覆盖现有的 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 时出现错误?

【问题讨论】:

    标签: indexing in-memory-database lokijs


    【解决方案1】:

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

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

    【讨论】:

    • 问题是关于 WRITE 唯一索引。如果我尝试将现有值插入到索引字段,我需要返回一个数据库错误。
    • @Danny 看到我的更新。抱歉,我忘了指定您实际要查找的详细信息。
    • 我无法捕捉抛出的“重复”错误:( ...我将在新答案中发布我的代码
    • 看起来你是维护者 :-) ...我认为文档需要修改。不阅读代码很难找到自己的方式。我试图通过在 src/lokijs.js 的几个部分添加 try catch 来修复本地错误,但范围没有链接。所以不会注意到抛出的错误!我自己无法修复这个错误(我试过了!)。
    • @Danny 也许值得在 github 上打开一个问题
    【解决方案2】:
    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 } ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多