collection groupでサブコレクションを横断検索(javascript)

JavaScript

サブコレクション内のドキュメントを検索したい時、横断的に検索する方法があります。
collectionGroupメソッドを用いて検索します。

今回の例は県(Prefecture)のドキュメントのサブコレクションに市区町村(Shikuchoson)が配置されているものをイメージしてください。

import {
  query,
  collectionGroup,
  getFirestore,
  where,
  getDocs,
} from 'firebase/firestore'

async function search(shikuchosonCode: string) {
  const db = getFirestore()
  const shikuchoson = query(
    collectionGroup(db, 'shikuchoson'),
    where('code', '==', shikuchosonCode),
  )

  const querySnapshot = await getDocs(shikuchoson)
  if (querySnapshot.size !== 1) {
    return null
  }

  return querySnapshot.docs[0]?.ref
}

collectionGroupを利用しない場合は親と子をそれぞれパラメータとして取得することになります。

collection(db, 'prefecture', prefectureCode, 'shikuchoson', shikuchosonCode)

横断的に検索する必要がなければこちらで十分なのですが、全てのサブコレクションの中から検索したい時は往々にして発生するため、collectionGroup関数を知っておいて損はないでしょう。

注意点として、サブコレクションを横断検索した場合は対象のドキュメントのIDが重複していない保証はないため、IDに依存した処理をする場合は十分考慮してください。

またサブコレクションを通して検索するにはfirestore.rulesに追記が必要です。

    match /{path=**}/shikuchoson/{document} {
      allow read: if true;
    }

コメント