Firestoreで複数のドキュメントをIDからクエリする方法【数制限あり】
※2020年1月時点では一回のクエリにつき10個までになります
そして最初にぶっちゃけてしまうと、まだ結構不便です。理由は以下の通り。
- 配列の中には10個しか値が入れられない。
- 「order」を使ってソートが出来ない気がする。
上記の縛りがあっても問題ないという方はこのままお付き合いください。
複数のドキュメントをIDを使ってクエリする方法
方法としては、2019年の11月に満を持して登場した「IN」クエリを使います。
これは特定のフィールドの値が渡された配列の中に含まれていた場合に、マッチしたドキュメントを取得するクエリになります。この記事では例としてSwiftで書きますが、他のサポートされている言語でも同様の事が出来ると思います。
以下、「IN」クエリを使った方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Firestore.firestore().collection("collectionName") .whereField(FieldPath.documentID(), isEqualTo: ["取得","したい","ドキュメントID"]) .getDocuments(){ (querySnapshot, err) in if let error = err{ print("error: \(error.localizedDescription)") return } guard let snapshot = querySnapshot else{ return } for document in snapshot.documents{ print("ドキュメントID:\(document.documentID)") } } |
特記するとしたら以下の部分になります。
1 |
.whereField(FieldPath.documentID(), isEqualTo: ["取得","したい","ドキュメントID"]) |
あまり公式でも触れられていない(私が調べた限りですと)のですが、ドキュメントのIDをwhereFieldに含めることは可能です。最初に調べていたときはドキュメントの中にIDのフィールドを作ってわざわざ入れないといけないのかなーと思っていたんですけど、ちゃんと公式で用意されていたみたいです。
そして、冒頭でも少し触れましたが「order」を使ってソート出来ない気がします。色々試したのですが、以下のようなエラーが返ってきて解決策が分からないまま諦めてしまいました。
以下エラー文
1 |
error: inequality filter property and first sort order must be the same: __name__ and created_at |
※「created_at」は私が指定したフィールドになります。ドキュメントを作成順に並び替えようと思ったのですが、出来ませんでした。
最後に、繰り返しになりますが、一回のクエリで最大10件までしか取得出来ません。配列の中に10個以上の値を入れてクエリに渡してみると、以下のようなエラーが返ってきます。
以下エラー文
1 |
uncaught exception 'FIRInvalidArgumentException', reason: 'Invalid Query. 'in' filters support a maximum of 10 elements in the value array.' |
このような理由から使いどころは結構限定されるかもしれませんが、以上、複数のドキュメントをIDを使ってクエリする方法でした。今後のアップデートに期待ですね。