[NeDBを使い方]データベースのドキュメントにインデックスを設定しよう。

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

NeDBはJavaScriptで作られたデータベースです。 Node.js、nw.js、エレクトロン、ブラウザ等で動かすことができます。 Github NeDBはドキュメント型データベースでJSONをそのまま保存できます。 そのため、JavaScriptのプログラムと親和性が高く、データの取得、利用が簡単にできます。 また、NeDBはMongoDBと互換性があり、一つのデータベースはMongoDBのコレクションと対応しています。 対応は下記の通りです。
  • データベース→コレクション
  • データロウ→ドキュメント
今回は、NeDBデータベースにデータにインデックスを設定する方法について書いていきます。

ドキュメントにインデックスを設定する

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:エラーが発生した時(大抵はユニーク制約違反)にコールバックが実行されます。この引数はオプションです
_idは自動的にユニーク制約が設定されるので、特にensureIndexを呼び出す必要なありません。 Datastore#removeIndex(fieldName、cb)を使用して、以前に作成したインデックスを削除できます。 データストアが永続的である場合、作成したインデックスは、自動的に2回目に作成されたデータベースをロードするときにデータファイルに保持されます。 ただし、ensureIndexを削除する必要はありません。すでにインデックスを持つデータベースで呼び出された場合は何も起こりません。 ensureIndex関数はインデックスを同期して作成するため、アプリケーションの起動時に使用することをお勧めします。 非常に速いので、スタートアップ時間を大幅に増やすことはありません(1万のドキュメントを含むコレクションの場合は35ミリ秒)。
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);
});
}