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 にフィールド名、valueASCDESCが入るので、それを確認する

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'];
}