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では、データの抽出条件の指定を強化しました。
ここでの紹介では、条件ごとにばらばらに説明しましたが、すべての条件は組み合わせて使用できます。
それから、ここでは紹介していない機能もいくつかあります。

詳しくは、ドキュメントやソースコードをどうぞ。