🤢

Firestoreの検索で条件分岐っぽいことする

1 min read

結論

query変数に追加し続ける。

let query  = firebase.firestore().collection('users').doc(id)

if (select) {
  query = query.where('select', '==', select)
}

if (limit) {
  query = query.limit(limit)
}

query.get()

実装例

api.ts

import firebase from 'firebase/app';
import 'firebase/firestore';
import { UserDocumentType } from '@/types/firestore.d.ts';

const fetchUsers = async (payload: {
  ids?: string[];
  group?: string;
  limit?: number;
}) => {
  const { ids, group, limit = 50} = payload;
  let query = firebase.firestore().collection('users');
  
  if (ids && ids.length > 0) {
   if (ids.length > 10) {
     // TODO: 10件を超える配列はfirestoreが非対応なのでバッチ処理の関数を作る
     return;
    }

    // 複数のドキュメントID指定で検索(最大10件)
    query = query.where(
      firebase.firestore.FieldPath.documentId(),
      'in',
      ids
    )
  }
  
  if (group) {
    query = query.where('group', '==', group)
  }
  
  const usersData = await query
    .limit(limit)
    .get()
    .then((querySnapshot) => {
      return querySnapshot.docs.map((doc) => {
        const data = doc.data() as UserDocumentType;
	data.id = doc.id;
	return data
      })
    })
    .catch((err) => throw err);
  return usersData;
}

export { fetchUsers }