it.todo("should be a (web)log");

役に立(つ/たない)技術情報やポエム

Firestoreに追加されるらしいIN/ARRAY_CONTAINS_ANYクエリについて

Firestoreの次のリリースで新しいクエリが追加されるようだ。(ソース: feat: Add IN queries support (blocked) by thebrianchen · Pull Request #715 · googleapis/nodejs-firestore · GitHub)具体的には

  • 指定された値のどれかに一致するドキュメントを選ぶ IN クエリ
  • ARRAY_CONTAINSIN版であるARRAY_CONTAINS_ANYクエリ

が使えるようになるらしい。

つまり、INクエリは、

collection.add({ a: 10 })
collection.add({ a: 20 })
collection.add({ a: 30 })

のようなコレクションに対して行うと

collection.where('a', 'in', [10, 20])
[ { a: 10 }, { a: 20 } ]

こんな感じの結果が返ってくるクエリで、指定した値(10, 20)のどれか1つにでも一致していればマッチする(はず)。 ARRAY_CONTAINS_ANYクエリは、

collection.add({ array: [ 10, 20 ] })
collection.add({ array: [ 20, 30 ] })
collection.add({ array: [ 30, 40 ] })

のようなコレクションに対して行うと

collection.where('array', 'array-contains-any', [ 10, 20 ])
[ { array: [10, 20] }, { array: [ 20, 30 ] } ]

のような結果が返ってくるクエリ(のはず)。

何に使えるの?

今までFirestoreになかったOR条件を記述できるクエリなので、応用範囲はかなり広いと思った。 例えば、SNSの実装で、投稿に投稿したユーザーのidやReferenceを持たせて、それをINクエリで検索することでホームタイムラインやリストの実装をすることができる。

不確定事項

これらのクエリはPRとして出ているだけで、実際にmasterに入ったわけでも、今デプロイされているFirestoreに実装されているわけでもないので、突然なかったことになる可能性もある。。 また入ったとして、それらがどれくらい他のクエリと組み合わせられるのか(ARRAY_CONTAINSのように一度だけしか使えないのか、インデックスを定義すれば複数回使えるのか)は今のところ不明。 続報を楽しみに待ちたい。