60
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

複数の自動生成されたIDでFirestoreのドキュメントをクエリする

Last updated at Posted at 2020-01-28

tl;dr

.where(firebase.firestore.FieldPath.documentId(), 'in', documentIds)

Firestoreで自動生成されたドキュメントIDを使用する動機

FirestoreのドキュメントのIDは規則正しくDocument1, Document2, ...などとふるのではなく、自動生成されたものを使ったほうがよいらしい(Cloud Firestore のベスト プラクティス)。
image.png

やりたいこと

複数のドキュメントを一度にIDで取得したい。 取得したいドキュメントのIDは自動生成されており、手元にあり、documentIdsというarrayに入っているとする。

ひとつのドキュメントの取得はわかる

自動生成されたIDをもつドキュメントでも、一つだけであればかんたんに取得できる。stack overflowに答えが載っている。
取得したいドキュメントのIDが"JxiBcP9YflmHbqdC4ndh"でコレクション名が"cities"であるとすると、クエリは

db.collection('cities')
  .doc('JxiBcP9YflmHbqdC4ndh')
  .get()

とすれば取得できる。問題は取得したいドキュメントが複数ある場合だ。この場合はどうすればいいか?

複数ドキュメントの取得(フィールドにもIDが登録されている場合)もわかる

ドキュメント自体に'doc_id'などのフィールドがある場合はかんたんにできる。ドキュメントIDでクエリするのではなく、そのフィールドでクエリすればよい。Cloud Firestore で単純なクエリと複合クエリを実行する(公式ドキュメント)'in'に関しては日本語版に記載がない…。
同じページの英語版には以下のように記載されている:
image.png

つまり

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で答えを見つけたのでこの記事を書いたが、公式ドキュメントのどこかにちゃんと記載されているのかもしれない。その場合はリンクを貼るので教えて下さい。

60
34
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?