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つの文字列の大小を表す-1
か0
か1
を返すようにします。
返り値としてデータベースを表すオブジェクトが得られます。以後このオブジェクトを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' ] }
は値がaaa
かbbb
であることを表します。$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引数はエラーオブジェクトです。
