2016-05-04 19 views
2

私は、5.3.2016現在、Lokijs.orgとNW.js v0.12.3-win-x64のLokijsを最新のものにしています。私は既にLokijsに保存されている文書を持っています:Lokijs:ユニークなキー違反の文書を挿入する

"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":{}}}

重複するキー値を挿入しようとするとエラーが発生します。このコレクションの 'username'キーに一意の制約を追加し、collection.uniqueNames配列に 'username'が含まれていることを確認しました。

期待どおりにコードを実行すると、追加のドキュメントがcollection.data配列に挿入されず、データベースが保存されます。ただし、エラーは生成されません。また、insertメソッドが実行された後に私がconsole.logにconsole.logを実行すると、それは次のように変更されます:

Object {username: "erik", meta: Object, $loki: 2}に変更されます。

キーの値を別のものに変更すると、一意のドキュメントが挿入され、正しく保存されます。

一意の制約に違反するキーを含む文書を挿入しようとすると、エラーが発生することはありますか?ありがとうございました。

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

{"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"}

クローンをテストするためのコード:

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(); 

答えて

0

あなたがclone: trueを使用しない場合は、あなたが呼び出す必要がありますcoll.update(document)を実行すると、インデックスの再計算が強制され、エラーがトリガーされます。

+0

返信いただきありがとうございます。私は空白の文書を挿入し、その文書を更新するとエラーが発生します。しかし、代わりに「クローン:真」を使用しようとすると、私は何かが欠けているようです。以前に説明したのと同じ結果が得られます。新しいdbとテストコードを含むように私の投稿を編集しました。私は何が欠けていますか? – eschlosser

+0

@eschlosser申し訳ありません私は物事を混乱させて言いました。クローンオプションは、変更するオブジェクトがデータストア内のものではないことを明らかにします。 update()は、再計算が行われる場所です。しかし、間違いなく挿入時にエラーが発生するはずです。多分githubで問題を開く価値があります。 –

関連する問題