情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでNeDBを使用する

NeDBを使用するにはnedbモジュールを利用します。

データベースのオープン

データベースをオープンするにはnedbクラスのコンストラクタを使用します。

var nedb = require('nedb');

var db = new nedb({
    filename: 'xxx', 
    inMemoryOnly: false, 
    timestampData: false, 
    autoload: false, 
    onload: function (err) {
    }, 
    afterSerialization: (line) {
        return 'yyy';
    }, 
    beforeDeserialization: (line) {
        return 'zzz';
    }, 
    corruptAlertThreshold: 0.1, 
    compareStrings: function (a, b) {
        return -1;
        //or
        return 0;
        //or
        return 1;
    }
});

第1引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

オプションには下のようなものがあります。

  • filename・・・データベースファイルのパスを指定します。
  • inMemoryOnly・・・オープンするデータベースがインメモリデータベースであるかを真偽値として指定します。このオプションがtrueである場合にはデータベースのオープン後にdb.loadDatabase関数を呼び出す必要はありません。デフォルトはfalseです。
  • timestampData・・・データベースで保持するドキュメントに作成日時と更新日時を付加するかを真偽値として指定します。作成日時はcreatedAtフィールドで保持され、更新日時はupdatedAtフィールドで保持されます。デフォルトはfalseです。
  • autoload・・・データベースのオープン後に自動的にロードも行うかを真偽値として指定します。このオプションがtrueである場合にはデータベースのオープン後にdb.loadDatabase関数を呼び出す必要はありません。デフォルトはfalseです。
  • onload・・・データベースのオープン後に自動的にロードも行う場合にロード後に呼び出される関数を指定します。この関数の第1引数はエラーオブジェクトです。
  • afterSerialization・・・ドキュメントのシリアライゼーションを変換する関数を指定します。この関数の第1引数は文字列として表された変換前のドキュメントのシリアライゼーションです。この関数では返り値として変換後のドキュメントのシリアライゼーションを返すようにします。ただし、ドキュメントのシリアライゼーションは\nを含んではなりませんので注意してください。
  • beforeDeserialization・・・ドキュメントのシリアライゼーションを逆変換する関数を指定します。この関数の第1引数は文字列として表された変換後のドキュメントのシリアライゼーションです。この関数では返り値として変換前のドキュメントのシリアライゼーションを返すようにします。ただし、ドキュメントのシリアライゼーションは\nを含んではなりませんので注意してください。
  • corruptAlertThreshold・・・オープンを許可するデータベースファイルの破損の割合の上限を0から1までの数値として指定します。デフォルトは0.1です。
  • compareStrings・・・文字列の比較関数を指定します。この関数の第1引数と第2引数は2つの文字列です。この関数では返り値として2つの文字列の大小を表す-101を返すようにします。

返り値としてデータベースを表すオブジェクトが得られます。以後このオブジェクトをdbと表記します。

データベースのロード

データベースをロードするにはdb.loadDatabase関数を使用します。

db.loadDatabase(function (err) {
});

第1引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトです。この引数は指定しなくても構いません。

ドキュメントの挿入

データベースにドキュメントを挿入するにはdb.insert関数を使用します。

db.insert({ foo: 'aaa', bar: 'bbb' }, function (err, doc) {
});
//
db.insert([{ foo: 'aaa', bar: 'bbb' }, { baz: 'ccc', qux: 'ddd' }], function (err, docs) {
});

第1引数にドキュメントを指定します。あるいは、1個以上のドキュメントを配列として指定することもできます。

第2引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトであり、第2引数は挿入したドキュメントあるいは挿入した1個以上のドキュメントの配列です。

ドキュメントの検索

データベースからドキュメントを検索するにはdb.find関数を使用します。

db.find({ foo: 'aaa', bar: 'bbb' }, function (err, docs) {
});
//or
var cursor = db.find({ foo: 'aaa', bar: 'bbb' });

第1引数にクエリをオブジェクトとして指定します。

たとえば、fooフィールドの値がaaaであり、barフィールドの値が/b/という正規表現にマッチするようなドキュメントを検索するには{ foo: 'aaa', bar /b/ }を指定します。

fooフィールドの値がオブジェクトであり、そのオブジェクトのbarフィールドの値がaaaであり、bazフィールドの値が{ qux: 'bbb', quux: 'ccc' }であるようなドキュメントを検索するには{ 'foo.bar': 'aaa', baz: { qux: 'bbb', quux: 'ccc' } }を指定します。

fooフィールドの値が配列であり、その配列の要素がオブジェクトであり、そのオブジェクトのbarフィールドの値がaaaであるようなドキュメントを検索するには{ 'foo.bar': 'aaa' }を指定します。

fooフィールドの値が配列であり、その配列の1つ目の要素がオブジェクトであり、そのオブジェクトのbarフィールドの値がaaaであるようなドキュメントを検索するには{ 'foo.0.bar': 'aaa' }を指定します。

また、比較演算子を使用することもできます。比較演算子を使用するには値や正規表現の代わりに{ $xxx: 'aaa' }のようなオブジェクトを指定します。ここで$xxxは比較演算子を表します。比較演算子には下のようなものがあります。

  • $lt・・・たとえば、{ $lt: 100 }は値が100より小さいことを表します。
  • $lte・・・たとえば、{ $lte: 100 }は値が100以下であることを表します。
  • $gt・・・たとえば、{ $gt: 100 }は値が100より大きいことを表します。
  • $gte・・・たとえば、{ $gte: 100 }は値が100以上であることを表します。
  • $in・・・たとえば、{ $in: ['aaa', 'bbb' ] }は値がaaabbbであることを表します。
  • $nin・・・たとえば、{ $nin: ['aaa', 'bbb' ] }は値がaaaでもbbbでもないことを表します。
  • $ne・・・たとえば、{ $ne: 100 }は値が100でないことを表します。
  • $exists・・・たとえば、{ $exists: true }はフィールドが存在することを表し、{ $exists: false }はフィールドが存在しないことを表します。
  • $regex・・・たとえば、{ $regex: /b/ }は値が/b/という正規表現にマッチすることを表します。
  • $size・・・たとえば、{ $size: 10 }は値が要素数が10の配列であることを表します。
  • $elemMatch・・・たとえば、{ $elemMatch: { foo: 'aaa', bar: 'bbb' } }は値が要素の1つとして{ foo: 'aaa', bar: 'bbb' }を含む配列であることを表します。

また、論理演算子を使用することもできます。論理演算子を使用するには値や正規表現や比較演算子の代わりに{ $xxx: [{ foo: 'aaa' }, { bar: 'bbb' }] }のようなオブジェクトを指定します。ここで$xxxは論理演算子を表します。論理演算子には下のようなものがあります。

  • $and・・・たとえば、{ $and: [{ foo: 'aaa' }, { bar: 'bbb' }] }fooフィールドの値がaaaであり、かつ、barフィールドの値がbbbであることを表します。
  • $or・・・たとえば、{ $or: [{ foo: 'aaa' }, { bar: 'bbb' }] }fooフィールドの値がaaaであるか、あるいは、barフィールドの値がbbbであることを表します。
  • $not・・・たとえば、{ $not: { foo: 'aaa' } }fooフィールドの値がaaaでないことを表します。
  • $where・・・たとえば、{ $where: function () { return this.foo && this.foo === 'aaa' } }fooフィールドが存在し、値がaaaであることを表します。

第2引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトであり、第2引数は1個以上のドキュメントの配列です。この引数は指定しなくても構いません。

第2引数を指定しなかった場合には返り値としてカーソルを表すオブジェクトが得られます。このオブジェクトは下のような関数を有します。

  • sort関数・・・ソートを行います。第1引数にキーをオブジェクトとして指定します。このオブジェクトのプロパティ名はキーのフィールド名とし、プロパティの値は1-1とします。1は昇順を表し、-1は降順を表します。
  • skip関数・・・ドキュメントをスキップします。第1引数にスキップするドキュメントの件数を指定します。
  • limit関数・・・ドキュメントの件数を限定します。第1引数にドキュメントの件数を指定します。
  • exec関数・・・ドキュメントの検索を実行します。第1引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトであり、第2引数は1個以上のドキュメントの配列です。

ドキュメントの数え上げ

データベースからドキュメントを数え上げるにはdb.count関数を使用します。

db.count({ foo: 'aaa', bar: 'bbb' }, function (err, count) {
});

第1引数にクエリをオブジェクトとして指定します。

第2引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトであり、第2引数はドキュメントの件数です。

ドキュメントの削除

データベースからドキュメントを削除するにはdb.remove関数を使用します。

db.remove({ foo: 'aaa', bar: 'bbb' }, { multi: false }, function (err, count) {
});

第1引数にクエリをオブジェクトとして指定します。

第2引数にオプションをオブジェクトとして指定します。

オプションには下のようなものがあります。

  • multi・・・複数のドキュメントの削除を行うかを真偽値として指定します。デフォルトはfalseです。

第3引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトであり、第2引数は削除されたドキュメントの件数です。

インデックスの作成

データベースにインデックスを作成するにはdb.ensureIndex関数を使用します。

db.ensureIndex({
    fieldName: 'xxx', 
    unique: false
}, function (err) {
});

第1引数にオプションをオブジェクトとして指定します。

オプションには下のようなものがあります。

  • fieldName・・・インデックスを作成するフィールド名を指定します。
  • unique・・・フィールドの値が重複してはならないかを真偽値として指定します。デフォルトはfalseです。

第2引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトです。

インデックスの削除

データベースからインデックスを削除するにはdb.removeIndex関数を使用します。

db.removeIndex('xxx', function (err) {
});

第1引数にインデックスを削除するフィールド名を指定します。

第2引数にコールバック関数を指定します。このコールバック関数の第1引数はエラーオブジェクトです。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js