Firestoreのルールで、listのオペレーションに対してクエリの条件が正しいかどうか確かめることができるのだが、
orderBy
を使おうと思った時にリファレンスを見ても詳しく書かれていなかったので調べてみた。
orderByでソートして取得する場合
client側ではこんな感じで取得する
firestore.collection("cities")
.order(by: "name", descending: true)
firestore.collection('cities')
.orderBy('name', 'desc')
この時に、セキュリティルール側でも、orderBy
のクエリがある時に、listのルールが許可されるようにする。
リファレンスを見る
query non-null rules.Map Map of query properties, when present.
- limit - query limit clause.
- offset - query offset clause.
- orderBy - query orderBy clause.
なるほど、よくわからん。
limit
は例が掲載されていてわかりやすいが、orderByの場合どんな形で使うのかがわからない。。
// Limit documents per request to 50
allow list: if request.query.limit && request.query.limit <= 50
実際にルールを書いて何度も試してみてようやく正体を掴むことが出来た
request.query.orderByを使う
request.query.orderBy
を使うと、セキュリティルールでorderByの確認ができる。
orderBy
はmap型になっていて、key にフィールド名、value にASC
かDESC
が入るので、それを確認する
match /cities/{cityID} {
allow list: if request.query.orderBy.name == 'DESC';
}
もし複数のorderBy
を指定している場合はこんな感じ:
match /cities/{cityID} {
allow list: if request.query.orderBy.name == 'DESC'
&& request.query.orderBy.population == 'ASC'
}
orderByが指定されているかだけ見たい場合
ASC
DESC
いずれの条件でも良くて、単にorderBy
が指定されているか見たい場合はこんな感じ
match /cities/{cityID} {
allow list: if request.query.orderBy.name in ['ASC', 'DESC'];
}