[NeDBを使い方]データベースのドキュメントにインデックスを設定しよう。
NeDBはJavaScriptで作られたデータベースです。 Node.js、nw.js、エレクトロン、ブラウザ等で動かすことができます。 Github NeDBはドキュメント型データベースでJSONをそのまま保存できます。 そのため、JavaScriptのプログラムと親和性が高く、データの取得、利用が簡単にできます。 また、NeDBはMongoDBと互換性があり、一つのデータベースはMongoDBのコレクションと対応しています。 対応は下記の通りです。
- データベース→コレクション
- データロウ→ドキュメント
ドキュメントにインデックスを設定する
NeDBはインデックスの設定ができます。 インデックスを設定することで、速度の向上やフィールドのユニーク制約の強制をすることができます。インデックスはどのフィールドでも設定することができ、ドット記法を使うネストされたドキュメントにも設定することができます。インデックスを設定することで基本クエリや$in,$lt,$lte,$gt,$gteを使ったクエリの速度向上が図れます。インデックスをつけるフィールドの値がオブジェクト配列の場合はインデックスをつけることはできません。 インデックスを作成するには、Datastore#ensureIndex(options, callback)を使います。 Datastore#ensureIndexはいつでも呼び出すことができます(いくつかのデータが既にインサートされていても呼び出せます。)が、アプリケーションのスタートアップ時に呼び出すことをお勧めします。- options:下記のフィールドを持ちます。
- fieldName:フィールドの名前を指定してインデックスを登録します。ドット記法を指定することでネストされたドキュメントに対してもインデックスを設定できます。
- unique: ユニーク制約を強制します。ユニーク制約はフィールドが定義されていない2つのドキュメントに対してもエラーを発生させます。この引数はオプションで、デフォルトはfalseです。
- sparse: don’t index documents for which the field is not defined. Use this option along with ‘unique’ if you want to accept multiple documents for which it is not defined.この引数はオプションで、デフォルトはfalseです。
- expireAfterSeconds:設定したフィールドのDate値がシステム日付から指定した秒数経過すると自動的にドキュメントを削除することができます。このインデックス付きフィールドが指定されていない、またはDateオブジェクトではないドキュメントは無視されます。
- callback:エラーが発生した時(大抵はユニーク制約違反)にコールバックが実行されます。この引数はオプションです
export function setIndex() { let db = new Datastore({ filename: 'index_test', autoload: true , timestampData: true}); db.ensureIndex({ fieldName: 'somefield' }, function (err) { // エラーが発生しなかった場合はerrはnullになります。 console.log('err', err); }); // インデックスと一緒にユニーク制約を設定します。 db.ensureIndex({ fieldName: 'somefield', unique: true }, function (err) { console.log('err', err); }); // インデックスと一緒にsparseユニーク制約を設定します。 db.ensureIndex({ fieldName: 'somefield', unique: true, sparse: true }, function (err) { console.log('err', err); }); // ユニーク制約違反時のエラーメッセージのフォーマット db.insert({ somefield: 'nedb' }, function (err) { console.log('err', err); // err is null db.insert({ somefield: 'nedb' }, function (err) { // ユニーク制約違反が発生します。 // err = { errorType: 'uniqueViolated', key: 'name', message: 'Unique constraint violated for key name' } console.log('err', err); }); }); // インデックスを削除します。 db.removeIndex('somefield', function (err) { console.log('err', err); }); // 次の様にexpireAfterSecondsを使って設定すると1時間後にドキュメントが削除されます。 // dbのtimestampDataオプションをtrueにしています。 db.ensureIndex({ fieldName: 'createdAt', expireAfterSeconds: 3600 }, function (err) { console.log('err', err); }); // 次の様に使うことで削除時間を指定することができます。 db.ensureIndex({ fieldName: 'expirationDate', expireAfterSeconds: 0 }, function (err) { // コレクション内のドキュメントはシステム日時がexpirationDateの時間になると削除されます。 console.log('err', err); }); }