Firestoreで複数のドキュメントをIDからクエリする方法【数制限あり】

この記事では取得したい複数のドキュメントをID指定でクエリする方法を書いていきます。
※2020年1月時点では一回のクエリにつき10個までになります

 

従来のデータベースなどを使ったことがある場合はIDを配列に含めて複数のドキュメントをクエリすることは出来て当然だと思うかもしれませんが、Firestoreでは今までこれがサポートされていませんでした(というか未だに公式でもあまり触れられていない気がします)。

 

そして最初にぶっちゃけてしまうと、まだ結構不便です。理由は以下の通り。

  1. 配列の中には10個しか値が入れられない。
  2. 「order」を使ってソートが出来ない気がする。

上記の縛りがあっても問題ないという方はこのままお付き合いください。

複数のドキュメントをIDを使ってクエリする方法

方法としては、2019年の11月に満を持して登場した「IN」クエリを使います。

これは特定のフィールドの値が渡された配列の中に含まれていた場合に、マッチしたドキュメントを取得するクエリになります。この記事では例としてSwiftで書きますが、他のサポートされている言語でも同様の事が出来ると思います。

以下、「IN」クエリを使った方法です。

 

特記するとしたら以下の部分になります。

 

あまり公式でも触れられていない(私が調べた限りですと)のですが、ドキュメントのIDをwhereFieldに含めることは可能です。最初に調べていたときはドキュメントの中にIDのフィールドを作ってわざわざ入れないといけないのかなーと思っていたんですけど、ちゃんと公式で用意されていたみたいです。

そして、冒頭でも少し触れましたが「order」を使ってソート出来ない気がします。色々試したのですが、以下のようなエラーが返ってきて解決策が分からないまま諦めてしまいました。

以下エラー文

※「created_at」は私が指定したフィールドになります。ドキュメントを作成順に並び替えようと思ったのですが、出来ませんでした。

最後に、繰り返しになりますが、一回のクエリで最大10件までしか取得出来ません。配列の中に10個以上の値を入れてクエリに渡してみると、以下のようなエラーが返ってきます。

以下エラー文

 

このような理由から使いどころは結構限定されるかもしれませんが、以上、複数のドキュメントをIDを使ってクエリする方法でした。今後のアップデートに期待ですね。

参考URL