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

LokiJS: insert existing value for index doesn't error - how to make unique indices?

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

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

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

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