背景
みなさん、Firebaseは使っていますか?
簡単なアプリケーション作成に必要な機能が揃っていてとても便利ですよね。
私もとても素晴らしいサービスだと考えているのですが、公式ドキュメントをちらっと読んだ感じだと気付かなさそうな仕様があり、今回はそれを共有させて頂きたいと思います。
問題
以下のコードを見てください。
CollectionにあるDocumentを全件取得するコードです。
docs = db.collection(u'cities').stream()
for doc in docs:
print(u'{} => {}'.format(doc.id, doc.to_dict()))
出典:公式ドキュメント
では、このコードを下のように変更するとどうなるでしょうか。
docs = db.collection(u'cities').stream()
for doc in docs:
#nanka omoi syori
time.sleep(100)
print(u'{} => {}'.format(doc.id, doc.to_dict()))
このようにして実行してみると、最初の一件以外出力されていないことが確認できると思います。
解決策
取得するべきdocumentの中身が小さく、そこまで量もない場合には、例えば次のようにして一度全件取得すれば良いでしょう。
docs = [doc.id for doc in db.collection(u'cities').stream()]
for doc_id in docs:
#nanka omoi syori
time.sleep(100)
print(doc_id)
巨大Collectionを取得したい場合もあると思います。
その場合には以下のリンクを参考にしてクエリカーソルを使用していただければと思います。
stack overflowの質問
クエリカーソルについての公式ドキュメント
最後に
この件について記載のあるQiita記事等の日本語資料を探してみたのですが、全くヒットしませんでした...(2020/2/2時点)
この件はアプリケーションの種類によってはクリティカルになりうると思うので、これからFirebaseを勉強しようと思っている、または、実務で使うかもしれない方々の学習の一助になれば幸いです。