2016-05-04 6 views
2

Ich führe die neuesten, ab 5.3.2016, Lokijs von Lokijs.org und NW.js v0.12.3-win-x64 minimiert. Ich habe ein Dokument bereits in Lokijs gespeichert:Lokijs: Einfügen eines Dokuments mit eindeutiger Schlüsselverletzung

"collections":[{"name":"admins","data":[{"username":"erik","meta":{"revision":1,"created":1459028934981,"version":0,"updated":1462333795190},"$loki":1}],"idIndex":[1],"binaryIndices":{},"constraints":null,"uniqueNames":["username"],"transforms":{},"objType":"admins","dirty":true,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableChangesApi":true,"autoupdate":false,"ttl":{"age":null,"ttlInterval":null,"daemon":null},"maxId":2,"DynamicViews":[],"events":{"insert":[null],"update":[null],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[null],"delete":[null],"warning":[null]},"changes":[],"username":{"name":"username","regExp":{}}}.

Ich versuche, einen Fehler zu erzeugen, wenn ich versuche, einen doppelten Schlüsselwert einzufügen. Ich habe eine einzigartige Einschränkung für den 'Benutzername' Schlüssel in dieser Sammlung hinzugefügt und verifiziert, dass das Array 'collection.uniqueNames' 'Benutzername' enthält.

Wenn ich den Code unten ausführen, wie erwartet, werden keine zusätzlichen Dokumente in das collection.data-Array eingefügt und die Datenbank wird gespeichert. Es werden jedoch keine Fehler generiert. Wenn ich das Dokumentobjekt nach der Ausführung der Einfügemethode console.log anlogge, ändert sich auch Folgendes:

Object {username: "erik", meta: Object, $loki: 2}.

Wenn ich den Schlüsselwert auf etwas anderes ändere, wird das eindeutige Dokument eingefügt und ordnungsgemäß gespeichert.

Wie gehe ich beim Generieren eines Fehlers vor, wenn versucht wird, ein Dokument einzufügen, das Schlüssel enthält, die eindeutige Einschränkungen verletzen? Vielen Dank.

insertDocument: function(objParameters) { 

    var collection = objParameters.insert.collection; 
    collection.ensureUniqueIndex('username'); 
    var document = {username: ''}; 
    document.username = 'erik'; 

    collection.on('error', function(err) { 
     return console.log(err); 
    }); 

    collection.insert(document); 

    return thisModule.$body.triggerHandler('app.database.save'); 
} 

EDIT: loki.db Klon testen

{"filename":"loki.db","collections":[{"name":"test","data":[{"name":"erik","meta":{"revision":0,"created":1462493328062,"version":0},"$loki":1}],"idIndex":[1],"binaryIndices":{},"constraints":null,"uniqueNames":["name"],"transforms":{},"objType":"test","dirty":true,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"transactional":false,"cloneObjects":true,"cloneMethod":"parse-stringify","asyncListeners":false,"disableChangesApi":true,"autoupdate":false,"ttl":{"age":null,"ttlInterval":null,"daemon":null},"maxId":2,"DynamicViews":[],"events":{"insert":[null],"update":[null],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[null],"delete":[null],"warning":[null]},"changes":[]}],"databaseVersion":1.1,"engineVersion":1.1,"autosave":false,"autosaveInterval":5000,"autosaveHandle":null,"options":{},"persistenceMethod":"fs","persistenceAdapter":null,"verbose":false,"events":{"init":[null],"loaded":[],"flushChanges":[],"close":[],"changes":[],"warning":[]},"ENV":"NODEJS"}

-Code-Klon zu testen:

var loki = require('lokijs-1.3.min.js'); 
var db = new loki(); 
var collection = db.addCollection('test', { 
    clone: true, 
    unique: 'name' 
}); 

collection.on('error', function(error) { 
    return console.log(error); 
}); 

collection.insert({ name: 'erik'}); 
collection.insert({ name: 'erik'}); 

db.saveDatabase(); 

Antwort

0

Wenn Sie nicht clone: true verwenden, dann müssen Sie rufen coll.update(document), um die Index-Neuberechnung zu erzwingen, wodurch der Fehler ausgelöst wird.

+0

Danke für Ihre Antwort Joe. Ich erhalte einen Fehler, wenn ich ein leeres Dokument einfüge und dieses Dokument dann aktualisiere. Allerdings scheint mir etwas zu fehlen, wenn ich stattdessen "clone: ​​true" verwende. Ich erhalte die gleichen Ergebnisse wie zuvor beschrieben. Ich habe meinen Beitrag bearbeitet, um den neuen db und den Testcode aufzunehmen. Was vermisse ich? – eschlosser

+0

@eschlosser Entschuldigung Ich habe Dinge auf verwirrende Weise formuliert. Die Klonoption macht nur deutlich, dass das Objekt, das Sie ändern, nicht das Objekt im Datenspeicher ist. update() ist der Ort, an dem die Neuberechnung stattfindet. Allerdings sollte es definitiv einen Fehler beim Einfügen geben, vielleicht lohnt es sich, ein Problem auf GitHub zu öffnen. –