Version.stores() - zuki/Dexie.js GitHub Wiki
version.stores(schemaDefinition);
schemaDefinition : Object | オブジェクト。ここで、各キーはオブジェクトストアの名前を、各値はスキーマを表す。 |
このバージョンで追加、変更、削除するテーブルを指定する。引数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" はプロパティ userId1、userId2、relationのインデックスを持つ。
- テーブル "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