Version.stores() - zuki/Dexie.js GitHub Wiki

文法

version.stores(schemaDefinition);

パラメタ

schemaDefinition : Object オブジェクト。ここで、各キーはオブジェクトストアの名前を、各値はスキーマを表す。

返り値

Version

記述

このバージョンで追加、変更、削除するテーブルを指定する。引数schemaDefinitionの各キーはテーブル名を、各値はまず主キーを、次いで索引化する一連のプロパティを表す。SQLとは異なり、すべてのプロパティを指定する必要はなく、インデックス化するものだけで良い。

Dexieのバージョニング機構を使ってテーブルを追加、変更、削除する方法を説明したデータベースのバージョニングを参照されたい。

スキーマ文法

++ 自動採番の主キー
& ユニークインデックス
* 複数値インデックス
[A+B] 複合インデックス/主キー

詳細: 主キーは暗黙的にユニークとみなされる

詳細なスキーマ文法

スキーマ定義文字列の最初のエントリは常に主キーを表す。

主キーの文法
++keyPath 自動採番の主キー 主キーは自動採番されることを意味する。主キーは常にユニークでなければならない。
++ 隠し自動採番主キー 主キーは自動採番されるが、オブジェクト上では見ることはできないことを意味する。
keyPath 自動採番しない主キー 主キーはどんな型でもよいが、自分で指定しなければならないことを意味する。
(空欄) 隠し主キー 最初のエントリーを空欄にすることは、主キーは隠され、自動採番されないことを意味する。
インデックスの文法
keyPath keyPathはインデックス化されることを意味する。
&keyPath ユニーク keyPathはインデックス化され、キーはユニークでなければならないことを意味する。
*keyPath 複数値 キーが配列の場合は、各配列値がオブジェクトのキーだとみなされることを意味する。
[keyPath1+keyPath2] 複合 keyPath1とkeyPath2の複合インデックスを定義する。

注: keyPathはプロパティ名を、ドット区切りのパスはネスト化プロパティを表す。

var db = new Dexie('MyDatabase');
db.version(1).stores({
    friends: '++id,name,shoeSize', // 主キーは自動採番 (++id)
    pets: 'id, name, kind',        // 主キーは自動採番されない (id)
    cars: '++, name',              // 主キーは自動採番だが、外からは見えない
    enemies: ',name,*weaknesses',  // 主キーは外から見えず、自動採番もされない
                                   // 'weaknesses' はキーの配列を含む (*)
    users: 'meta.ssn, addr.city',  // ドット区切りのkeypathはネスとかプロパティを表す
    people: '[name+ssn], &ssn'     // 複合主キー。ユニークインデックスのssn
});

詳細例

次の例は所定のバージョンのスキーマを定義する方法を示す。

var db = new Dexie("FriendsAndPetsDatabase");
db.version(1).stores({
    users: "++id, name, &username, *email, address.city",
    relations: "++, userId1, userId2, [userId1+userId2], relation"
});
db.open().catch(function (e) {
    console.error("Open failed: " + e.stack);
}

db.transaction('rw', db.users, function () {

    db.users.add({
        name: "Zlatan",
        username: "ibra",
        email: [
            "[email protected]",
            "[email protected]"
        ],
        address: {
            city: "Malmö",
            country: "Sweden"
        }
    });

    db.users.where("email").startsWith("zlatan")
        .or("address.city").anyOf (["Malmö", "Stockholm", "Barcelona"])
        .each(function (user) {
            console.log("Found user: " + user.name);
        });

}).catch (function (e) {
    console.error(e.stack);
});

詳細例の説明

  • テーブル "users" は以下を持つ:
    • idという名の児童採番の主キー
    • 任意の型のnameプロパティのインデックス
    • usernameプロパティのユニークインデックス
    • emailプロパティの_マルチ_インデックス。これはインデックスには複数のemailの登録を許すこと、各emailをインデックス化し、単一のuserオブジェクトを検索する事ができることを意味する。注意! この機能はIEではサポートされない。
    • ネスト化プロパティ'address.city'のインデックス
  • テーブル "relations" は「外部から見える」主キーを持たない(ただし、内部的には自動採番される主キーを持っている)
  • テーブル "relations" はプロパティ userId1userId2relationのインデックスを持つ。
  • テーブル "relations" はプロパティ userId1 と userId2 を合わせた複合インデックスを持つ。注意! この機能はIEではサポートされない。

これらのインデックスを使って行えるクエリーの例:

  • db.users.get(2) - idが2のユーザが得られる
  • db.users.where('name').startsWithIgnoreCase('da') - namaeが"da"で始まるすべてのユーザが得られる
  • db.users.where('username').equals('usrname').first() - usernameが"usename"のユーザが得られる
  • db.users.where('email').startsWith('david@').distinct() - emailのどれかが'david@'で始まるユーザが得られる
  • db.users.where('address.city').equalsIgnoreCase('malmö') - Malmöに住んでいるすべてのユーザが得られる
  • db.relations.where('userId1').equals(2) - idが2ユーザが他のユーザに対して持つすべての関係が得られる
  • db.relations.where('relation').anyOf('wife', 'husband', 'son', 'daughter') - すべての家族関係が得られる
  • db.relations.where('userId1').equals(2).or('userId2').equals(2) - idが2のユーザが他のユーザに対して持つ、あるいは他のユーザがidが2のユーザに対して持つすべての関係が得られる
  • db.relations.where('[userId1+userId2]').equals([2,3]) - ユーザ2がユーザ3に対して持つすべての関係が得られる
  • db.relations.where('[userId1+userId2]').equals([2,3]).or('[userId1+userId2]').equals([3,2]) - ユーザ2がユーザ3に対して持つ、あるいはユーザ3がユーザ2に対して持つすべての関係が得られるw
⚠️ **GitHub.com Fallback** ⚠️