[NeDBを使おう]データベースをロード、クリエイトしよう。

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

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

NeDBを使ってデータベースをロード/クリエイトする

NeDBはインメモリデータベースとしても、永続化データベースとしてもしようすることがあります。 NeDBを使うにはDatastoreのコンストラクタを使用してインスタンス化することでしようできます。 また、コンストラクタはオプションの引数をもち、このオプションの設定によりインメモリ/永続化等の設定ができます。

インメモリデータベースをクリエイトする

インメモリデータベースはメモリ上でデータを操作するため、タブを削除したり、タブを更新することでデータベース内のデータは消えてしまいます。 タブのライフサイクルを超えてデータを保持する必要がない場合はインメモリデータベースを利用するといいでしょう。
import Datastore from 'nedb'

function testDatabase() {
  let db = new Datastore();
}

永続化データベースをロード/クリエイトする

永続化データベースを使うと、インメモリデータベースの場合と異なりタブのライフサイクルを超えてデータを保持することができます。 データベース内のデータはブラウザのIndexedDBにJSON文字列として保存されます。データベースには任意の名前をつけることができます。 この名前を元にロードクリエイトを行います、IndexedDBに指定した名前が存在した場合はJSON文字列をロードし、指定した名前が存在しない場合は新しく空のデータベースをクリエイトします。 永続化データベースの場合、Datastoreをインスタンス化するだけではデータベースのロードは完了しません。 Datastore#loadDatabaseを使ってロードを促す必要があります。Datastore#loadDatabaseは完了時のコールバックを引数に持ちます。このコールバックが帰ってくるまでデータベースに対するコマンドは実行することができません。
import Datastore from 'nedb'

function testDatabase() {
  let db = new Datastore({ filename: 'hoge' });
  db.loadDatabase(function (err) {
    // Callback is optional
    // Now commands will be executed
  });
}

NeDBのオプション

データベースをロード/クリエイトする時にオプションを指定することができます。 オプションによって挙動が変わってくるので、適切に設定しましょう。

永続化時のデータベースの名前を指定する

filenameを指定することでデータベースの保存名を指定することができます。データベースのクリエイト以降は指定したfilenameでロードすることができます。空を指定した場合はインメモリデータベースになります。 また、NeDBはcrash-safe writesを行うため、filenameに指定する文字列は一時ファイルのように「~」で終わることはできません。
import Datastore from 'nedb'

function testDatabase() {
  let db = new Datastore({ filename: 'hoge' });
  db.loadDatabase(function (err) {
    // Callback is optional
    // Now commands will be executed
  });
}

インメモリデータベースを使用する

inMemoryOnlyにtrueをすることでインメモリデータベースに制限することができます。デフォルトではfalseになっています。
import Datastore from 'nedb'

function testDatabase() {
  let db = new Datastore({ inMemoryOnly: true });
}

ドキュメントにクリエイトタイムスタンプとラストアップデートタイムスタンプフィールドを追加する

timestampDataをtrueに設定することで、ドキュメントのクリエイト時(createdAt)とアップデート時(updatedAt)のタイムスタンプを自動で設定、更新するようになります。
import Datastore from 'nedb'

function testDatabase() {
  let db = new Datastore({ timestampData: true });
}

永続化データベースのオートロード

Datastoreをインスタンス化するだけではデータベースのロードは完了しません。 Datastore#loadDatabaseを明示的に呼び出す必要があります。しかし、autoloadをtrueに設定することでインスタンス化と同時にロード処理をおこなってもらいます。また、ロードが完了する前に実行されたデータベースへのコマンドはロードが完了されたタイミングで実行されます。 また、autoloadオプション設定した場合、onloadオプションを設定することができます。 onloadはロード処理の完了時のコールバック関数を設定ができます。コールバック関数は一つの引数を持ち、エラーがあった場合の情報が渡されます。 autoloadが有効になった状態でロードエラーが発生した場合、onloadが設定されていない場合エラーが発生します。
import Datastore from 'nedb'

function testDatabase() {
  let options = {
      filename : 'hoge',
      autoload : true,
      onload : function(err) {
          console.log('onload', err);
      }
  }
  let db = new Datastore(options);
}

文字列ソート時の比較方法を変更する

compareStringsを使うことで文字列ソート時の比較方法を変更する関数を設定することができます。 この関数は二つの引数を持ち、-1,0,1のいづれかの値を返却する必要があります。
import Datastore from 'nedb'

function testDatabase() {
  let options = {
        compareStrings: function compareStrings(a, b){
            console.log('a', a);
            console.log('b', b);
            if( a === b ) {
                return 0
             } else if(a > b) {
                 return 1
             } else {
                 return -1
             }
        }
  }
  let db = new Datastore(options);
}

afterSerialization(調査中のオプション)

afterSerialization (optional): hook you can use to transform data after it was serialized and before it is written to disk. Can be used for example to encrypt data before writing database to disk. This function takes a string as parameter (one line of an NeDB data file) and outputs the transformed string, which must absolutely not contain a \n character (or data will be lost).

beforeDeserialization(調査中のオプション)

beforeDeserialization (optional): inverse of afterSerialization. Make sure to include both and not just one or you risk data loss. For the same reason, make sure both functions are inverses of one another. Some failsafe mechanisms are in place to prevent data loss if you misuse the serialization hooks: NeDB checks that never one is declared without the other, and checks that they are reverse of one another by testing on random strings of various lengths. In addition, if too much data is detected as corrupt, NeDB will refuse to start as it could mean you’re not using the deserialization hook corresponding to the serialization hook used before (see below).

corruptAlertThreshold(調査中のオプション)

corruptAlertThreshold (optional): between 0 and 1, defaults to 10%. NeDB will refuse to start if more than this percentage of the datafile is corrupt. 0 means you don’t tolerate any corruption, 1 means you don’t care.

複数のデータベースをロード・クリエイトする

データベースは幾つでもロード・クリエイトすることができます。 一つのデータベースに対して一つのインスタンスを生成します。
import Datastore from 'nedb'

function testDatabase() {
  let nameList = ['hoge','hogehoge','fuga']
  let dbs = loadOrCreateDatabaseList(nameList);
}

function loadOrCreateDatabaseList(nameList) {
    // Of course you can create multiple datastores if you need several
    // collections. In this case it's usually a good idea to use autoload for all collections.
    var dbs = {};
    for (let i = 0; i < nameList.length; i++) {
        const name = nameList[i];
        dbs[name] = new Datastore({ filename: name, autoload: true });
    }
    return dbs
}