Indexing LokiJS:为索引插入现有值';t错误-如何创建唯一索引?

Indexing LokiJS:为索引插入现有值';t错误-如何创建唯一索引?,indexing,in-memory-database,lokijs,Indexing,In Memory Database,Lokijs,如果我试图覆盖现有的索引的字段,我不会得到错误。 它应该是错误的,因为它不是update() 在尝试插入现有用户ID时,如何创建唯一索引以获取错误?使用索引选项可以在字段上创建索引,这样可以更快地进行检索,因为索引位于集合中单独的排序数组中(因此Loki可以使用二进制搜索而不是全循环来获取记录)。但是,您正在寻找一个唯一的索引,该索引是使用ensureUniqueIndex创建的(选中,向下滚动以查找文档,其中有一个关于唯一索引的部分)。这样,您就可以使用收集方法by(field,value)(

如果我试图覆盖现有的
索引的
字段,我不会得到错误。 它应该是错误的,因为它不是
update()


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

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

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

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

这是我的安慰:

[ { 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 } ]

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