1

如果我尝试覆盖现有 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!!

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

4

2 回答 2

1

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

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

于 2015-07-06T08:35:53.047 回答
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}处理抛出的错误

那是我的控制台:

[ { 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 } ]
于 2015-07-06T12:46:28.447 回答