KageDB 0.0.6リリース - fetchで多くの抽出条件を指定可能に
Indexed Database API(IndexedDB)を使いやすくするためのライブラリKageDB 0.0.6をリリースしました。
今回は、fetchという機能を強化して多くの抽出条件を指定可能にしました。これでカーソル処理が必要になることはほとんどなくなるはず。
以下、機能の紹介です。
前提として、myDBというデータベースがあってその中にpersonというオブジェクトストアがあるとします。personには、nameというインデックスが定義されています。データベースの設定に関するコードは次のようになります。
var myDB = new KageDB({ name: "myDB", version: 1, migration: { 1: function (ctx, next) { var db = ctx.db; var person = db.createObjectStore("person", { keyPath: "id", autoIncrement: true }); person.createIndex("name", "name", { unique: false }); person.bulkAdd([ { name: "aaa", age: 10 }, { name: "bbb", age: 20 }, { name: "ccc", age: 30 }, { name: "ddd", age: 40 }, { name: "eee", age: 50 }, { name: "fff", age: 60 } ], next); } } });
開始オフセットと最大取得件数
offset/limitを指定して、開始オフセットと最大取得件数を指定できます。次の例では、オフセットを1として最大で3件取得しています。
myDB.tx(["person"], function (tx, person) { person.fetch({ offset: 1, limit: 3 }, function (results) { console.log(JSON.stringify(results)); }); });
出力結果です。
[{"name":"bbb","age":20,"id":2},{"name":"ccc","age":30,"id":3},{"name":"ddd","age":40,"id":4}]
フィルタ
フィルタ用の関数を指定して検索対象を絞れます。次の例では、nameについてはインデックスを使って検索対象を絞り、ageについてはフィルタ用の関数で検索対象を絞っています。
myDB.tx(["person"], function (tx, person) { person.index("name").fetch({ ge: "c", filter: filter }, function (results) { console.log(JSON.stringify(results)); }); }); function filter(person) { return person.age >= 50; }
出力結果です。
[{"name":"eee","age":50,"id":5},{"name":"fff","age":60,"id":6}]
簡約
簡約ってあんまり使わない言葉ですよねー。reduceのことです。Arrayにreduceメソッドがありますね。あれに渡す関数と同じものだと思ってもらえればいいです。複数の値を1つの値にまとめることができます。SQLで言えば集約関数ですね。次の例では、全件を対象にageを集計しています。initialValueは一番最初のreduce関数の最初のパラメータに渡される値です。
myDB.tx(["person"], function (tx, person) { person.index("name").fetch({ reduce: sum, initialValue: 0 }, function (result) { console.log(result); }); }); function sum(prev, curr) { return prev + curr.age; }
出力結果です。
210
まとめ
KageDB 0.0.6では、データの抽出条件の指定を強化しました。
ここでの紹介では、条件ごとにばらばらに説明しましたが、すべての条件は組み合わせて使用できます。
それから、ここでは紹介していない機能もいくつかあります。
詳しくは、ドキュメントやソースコードをどうぞ。