Search code examples
indexingin-memory-databaselokijs

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


if I try to override an existing indexed field, I do not get an error. It should error, because it is not 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!!

How can I make an unique index to get an error when trying to inset an existing userID ?


Solution

  • 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);
    });
    

    Either users.on('error',...) nor try{ users.insert...} catch(e){// id+1} handles the thrown error

    That's my console:

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