Cloud Firestore まとめ
概要
- サーバーレスな
KeyValue
のデータストア
-
Cloud functions
から利用できる
- クライアント側のアプリからも直接アクセスできる
- セキュリティ設定に注意が必要
- データの更新について、リアルタイムに通知が受け取れる
簡単なサンプル
CloudFirestoreからデータを取得する
import * as admin from 'firebase-admin';
const userId = 'test_user'
const user = (await admin
.firestore()
.collection('users')
.doc(userId)
.get()).data();
console.info(JSON.stringify(user));
-
firebase-admin
を使用すると、Firestore
のアクセス制限の設定を無視してデータを取得できる
-
CloudFunctions
から利用するときはfirebase-admin
を利用して、別途CloudFunctions
側でアクセス制限する
-
CloudFunctions
からではなくクライアント側から直接Firestore
にアクセスするような時は、Firestore
のアクセス制限機能を利用する
CloudFirestoreへデータを設定する
import * as admin from 'firebase-admin';
const userId = 'test_user'
await admin
.firestore()
.collection('users')
.doc(userId)
.set({
name: 'Test user',
age: 23,
});
気にするべき特徴
- 1秒に1回しか更新できない
- インデックスがないと検索できない
-
where
に入れるためには必ずインデックスが必要
- 単一フィールドについてのインデックスは自動で作成してくれる
- 複合フィールドについては自分で作る必要がある
- なければ自動で作るためのURLをログに出してくれるので、そんなに面倒ではない
-
!=
で検索できない
- 国籍が日本以外のデータを検索、みたいなことができない
- 他の国籍全てについて
==
で検索して、全ての結果をマージするしかない
- 範囲検索が一つのフィールドにしか指定できない
- 年齢xx歳以上、体重xx以上、のように複数の範囲条件が指定できない
- 別々に検索してマージするしかない
-
orderBy
が範囲検索と捉えられるため、範囲検索が使えない場合も…
- よくある「商品データベース」みたいなものに利用すると、検索できなくなって困ると思う
- トランザクションがある
- 既に他の誰かが編集中だったりすると失敗してリトライされる
- 検索条件などに癖があるため、利用はきちんと検討してからにするべき
アクセス制限について
- 制限内容は専用フォーマットの設定ファイル(rulesファイル)に記載する
- アクセス制限のことを考えてデータ構造を設計しなくてはならない
データの項目にユーザーIDを入れておいてアクセス制限する例
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid} {
allow list: if request.auth != null && (request.auth.uid == resource.data.uid)
}
}
}
グループに所属するユーザーのみにアクセスを許可する例
- グループに所属しているかどうかを調べるのに
where
的に検索したいが、そのようなことはできない
- 仕方ないので
コレクション
のキー
をuid
にして、exists
で調べる
service cloud.firestore {
match /databases/{database}/documents {
match /groups/{gid} {
allow read: if request.auth != null && exists(/databases/$(database)/documents/groups/$(gid)/members/$(request.auth.uid));
}
}
}
参考サイト
目次
KeyValue
のデータストアCloud functions
から利用できる- セキュリティ設定に注意が必要
CloudFirestoreからデータを取得する
import * as admin from 'firebase-admin';
const userId = 'test_user'
const user = (await admin
.firestore()
.collection('users')
.doc(userId)
.get()).data();
console.info(JSON.stringify(user));
-
firebase-admin
を使用すると、Firestore
のアクセス制限の設定を無視してデータを取得できる-
CloudFunctions
から利用するときはfirebase-admin
を利用して、別途CloudFunctions
側でアクセス制限する
-
-
CloudFunctions
からではなくクライアント側から直接Firestore
にアクセスするような時は、Firestore
のアクセス制限機能を利用する
CloudFirestoreへデータを設定する
import * as admin from 'firebase-admin';
const userId = 'test_user'
await admin
.firestore()
.collection('users')
.doc(userId)
.set({
name: 'Test user',
age: 23,
});
気にするべき特徴
- 1秒に1回しか更新できない
- インデックスがないと検索できない
-
where
に入れるためには必ずインデックスが必要
- 単一フィールドについてのインデックスは自動で作成してくれる
- 複合フィールドについては自分で作る必要がある
- なければ自動で作るためのURLをログに出してくれるので、そんなに面倒ではない
-
!=
で検索できない
- 国籍が日本以外のデータを検索、みたいなことができない
- 他の国籍全てについて
==
で検索して、全ての結果をマージするしかない
- 範囲検索が一つのフィールドにしか指定できない
- 年齢xx歳以上、体重xx以上、のように複数の範囲条件が指定できない
- 別々に検索してマージするしかない
-
orderBy
が範囲検索と捉えられるため、範囲検索が使えない場合も…
- よくある「商品データベース」みたいなものに利用すると、検索できなくなって困ると思う
- トランザクションがある
- 既に他の誰かが編集中だったりすると失敗してリトライされる
- 検索条件などに癖があるため、利用はきちんと検討してからにするべき
アクセス制限について
- 制限内容は専用フォーマットの設定ファイル(rulesファイル)に記載する
- アクセス制限のことを考えてデータ構造を設計しなくてはならない
データの項目にユーザーIDを入れておいてアクセス制限する例
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid} {
allow list: if request.auth != null && (request.auth.uid == resource.data.uid)
}
}
}
グループに所属するユーザーのみにアクセスを許可する例
- グループに所属しているかどうかを調べるのに
where
的に検索したいが、そのようなことはできない
- 仕方ないので
コレクション
のキー
をuid
にして、exists
で調べる
service cloud.firestore {
match /databases/{database}/documents {
match /groups/{gid} {
allow read: if request.auth != null && exists(/databases/$(database)/documents/groups/$(gid)/members/$(request.auth.uid));
}
}
}
参考サイト
目次
-
where
に入れるためには必ずインデックスが必要 - 単一フィールドについてのインデックスは自動で作成してくれる
- 複合フィールドについては自分で作る必要がある
- なければ自動で作るためのURLをログに出してくれるので、そんなに面倒ではない
!=
で検索できない
- 国籍が日本以外のデータを検索、みたいなことができない
- 他の国籍全てについて
==
で検索して、全ての結果をマージするしかない
- 他の国籍全てについて
- 年齢xx歳以上、体重xx以上、のように複数の範囲条件が指定できない
- 別々に検索してマージするしかない
-
orderBy
が範囲検索と捉えられるため、範囲検索が使えない場合も… - よくある「商品データベース」みたいなものに利用すると、検索できなくなって困ると思う
- 既に他の誰かが編集中だったりすると失敗してリトライされる
- 制限内容は専用フォーマットの設定ファイル(rulesファイル)に記載する
- アクセス制限のことを考えてデータ構造を設計しなくてはならない
データの項目にユーザーIDを入れておいてアクセス制限する例
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid} {
allow list: if request.auth != null && (request.auth.uid == resource.data.uid)
}
}
}
グループに所属するユーザーのみにアクセスを許可する例
- グループに所属しているかどうかを調べるのに
where
的に検索したいが、そのようなことはできない - 仕方ないので
コレクション
のキー
をuid
にして、exists
で調べる
service cloud.firestore {
match /databases/{database}/documents {
match /groups/{gid} {
allow read: if request.auth != null && exists(/databases/$(database)/documents/groups/$(gid)/members/$(request.auth.uid));
}
}
}
参考サイト
目次
Author And Source
この問題について(Cloud Firestore まとめ), 我々は、より多くの情報をここで見つけました https://qiita.com/sfjwr/items/52933abcc5b2d27983a3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .