tl;dr
.where(firebase.firestore.FieldPath.documentId(), 'in', documentIds)
Firestoreで自動生成されたドキュメントIDを使用する動機
FirestoreのドキュメントのIDは規則正しくDocument1, Document2, ...などとふるのではなく、自動生成されたものを使ったほうがよいらしい(Cloud Firestore のベスト プラクティス)。
やりたいこと
複数のドキュメントを一度にIDで取得したい。 取得したいドキュメントのIDは自動生成されており、手元にあり、documentIds
というarrayに入っているとする。
ひとつのドキュメントの取得はわかる
自動生成されたIDをもつドキュメントでも、一つだけであればかんたんに取得できる。stack overflowに答えが載っている。
取得したいドキュメントのIDが"JxiBcP9YflmHbqdC4ndh"
でコレクション名が"cities"
であるとすると、クエリは
db.collection('cities')
.doc('JxiBcP9YflmHbqdC4ndh')
.get()
とすれば取得できる。問題は取得したいドキュメントが複数ある場合だ。この場合はどうすればいいか?
複数ドキュメントの取得(フィールドにもIDが登録されている場合)もわかる
ドキュメント自体に'doc_id'
などのフィールドがある場合はかんたんにできる。ドキュメントIDでクエリするのではなく、そのフィールドでクエリすればよい。Cloud Firestore で単純なクエリと複合クエリを実行する(公式ドキュメント)。'in'
に関しては日本語版に記載がない…。
同じページの英語版には以下のように記載されている:
つまり
db.collection('cities')
.where('doc_id', 'in', documentIds)
でできる。しかしせっかく自動生成されているのだし、いちいちそれをひとつひとつのドキュメントのフィールドに登録するのも面倒くさく、やりたくない。以下の方法であれば自動生成されているIDでも直接IDでクエリできる。
複数ドキュメントの取得(直接IDでクエリする場合)がわからなかった
firebase.firestore.FieldPath.documentId()
をつかえばよい。
import firebase from '@/firebase.js'
db.collection('cities')
.where(
firebase.firestore.FieldPath.documentId(),
'in',
documentIds
)
出典はstack overflowのQuery Firebase Firestore documents by the IDで、そこでは回答では1
,2
,3
,...とアサインされたIDに対して<100
という条件でクエリしているが、自動生成されたIDでも使えるし、不等号でなくても'in'
ももちろん使える。
単にドキュメントをちゃんと読めていないだけかもしれない
調べても全然出てこず、やっとstack overflowで答えを見つけたのでこの記事を書いたが、公式ドキュメントのどこかにちゃんと記載されているのかもしれない。その場合はリンクを貼るので教えて下さい。