🔥

【Flutter×Firebase】Cloud Firestoreクエリ一覧

2021/03/21に公開

where(特定の条件で抽出する)

演算子 意味 使い方
isEqualTo 〜と等しい .where('name', isEqualTo: '山田太郎')
isNotEqualTo 〜と等しくない .where('name', isNotEqualTo: '山田太郎')
isLessThan 〜より小さい .where('age', isLessThan: 20)
isLessThanOrEqualTo 〜以下 .where('age', isLessThanOrEqualTo: 20)
isGreaterThan 〜より大きい .where('age', isGreaterThan: 20)
isGreaterThanOrEqualTo 〜以上 .where('age', isGreaterThanOrEqualTo: 20)
arrayContains 配列内に右辺の要素を含む .where('hobbies', arrayContains: '釣り')
arrayContainsAny 配列内に右辺の要素のいずれかを含む .where('hobbies', arrayContainsAny: ['釣り', 'ギター'])
whereIn 右辺のいずれかが含まれている .where('name', whereIn: ['山田太郎', '山田花子'])
whereNotIn 右辺のいずれも含まれない .where('name', whereNotIn: ['山田太郎', '山田花子'])
isNull 右辺が null である・ない .where('name', isNull: true)

isEqualTo(〜と等しい)

「name」 が 「山田太郎」 であるユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('name', isEqualTo: '山田太郎').get();

isNotEqualTo(〜と等しくない)

「name」 が 「山田太郎」 でないユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('name', isNotEqualTo: '山田太郎').get();

isLessThan(〜より小さい)

「age」 が 20 より小さい( 20 の場合は含まない)ユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('age', isLessThan: 20).get();

isLessThanOrEqualTo(〜以下)

「age」 が 20 以下( 20 の場合を含む)のユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('age', isLessThanOrEqualTo: 20).get();

isGreaterThan(〜より大きい)

「age」 が 20 より大きい( 20 の場合は含まない)ユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('age', isGreaterThan: 20).get();

isGreaterThanOrEqualTo(〜以上)

「age」 が 20 以上( 20 の場合を含む)のユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('age', isGreaterThanOrEqualTo: 20).get();

arrayContains(配列内に右辺の要素を含む)

配列 「hobbies」 に 「釣り」 を含むユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('hobbies', arrayContains: '釣り').get();

arrayContainsAny(配列内に右辺の要素のいずれかを含む)

配列 「hobbies」 に 「釣り」 、 「ギター」 のいずれかを含むユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('hobbies', arrayContainsAny: ['釣り', 'ギター']).get();

whereIn(右辺のいずれかが含まれている)

「name」 が 「山田太郎」 、 「山田花子」 のいずれかであるユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('name', whereIn: ['山田太郎', '山田花子']).get();

whereNotIn(右辺のいずれも含まれない)

「name」 が 「山田太郎」 、 「山田花子」 のいずれでもないユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('name', whereNotIn: ['山田太郎', '山田花子']).get();

isNull(右辺が null である・ない)

「name」 がnullであるユーザーを抽出
final _store = FirebaseFirestore.instance;
await _store.collection('users').where('name', isNull: true).get();

orderBy(特定の条件で並べ替える)

昇順で取得

「age」 が小さい順に取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').orderBy('age', descending: false).get();

降順で取得

「age」 が大きい順に取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').orderBy('age', descending: true).get();

start, end(取得範囲の指定)

  • 〇〇 At ... そのドキュメントを「含む」(startAt, endAt等)
  • 〇〇 After, 〇〇 Before ... そのドキュメントを「含まない」 (startAfter, endBefore等)

startAt(特定条件に合致するドキュメント以降を取得)

最新順に並べ替え、dateTime に合致するドキュメント以降(そのドキュメントを含む)を取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').orderBy('createdAt', descending: true).startAt([Timestamp.fromDate(dateTime)]).get();

endAt(特定条件に合うドキュメントまでを読み込む)

最新順に並べ替え、dateTime に合致するドキュメントまで(そのドキュメントを含む)を取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').orderBy('createdAt', descending: true).endAt([Timestamp.fromDate(dateTime)]).get();

startAfter(特定条件に合致するドキュメントより後ろを取得)

最新順に並べ替え、dateTime に合致するドキュメント以降(そのドキュメントを含まない)を取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').orderBy('createdAt', descending: true).startAfter([Timestamp.fromDate(dateTime)]).get();

endBefore(特定条件に合うドキュメントの直前までを読み込む)

最新順に並べ替え、dateTime に合致するドキュメントまで(そのドキュメントを含まない)を取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').orderBy('createdAt', descending: true).endBefore([Timestamp.fromDate(dateTime)]).get();

startAtDocument(特定ドキュメント以降を取得)

最新順に並べ替え、startPointDoc 以降( startPointDoc を含む)のドキュメントを読み込む
final startPointDoc = await _store.collection('users').doc(id).get();
await _store.collection('users').orderBy('createdAt', descending: true).startAtDocument(startPointDoc).get();

endAtDocument(特定ドキュメントまでを読み込む)

最新順に並べ替え、endPointDoc まで( endPointDoc を含む)のドキュメントを読み込む
final endPointDoc = await _store.collection('users').doc(id).get();
await _store.collection('users').orderBy('createdAt', descending: true).endAtDocument(endPointDoc).get();

startAfterDocument(特定ドキュメントより後ろを読み込む)

最新順に並べ替え、previousDoc より後ろ( previousDoc は含まない)のドキュメントを読み込む
final previousDoc = await _store.collection('users').doc(id).get();
await _store.collection('users').orderBy('createdAt', descending: true).startAfterDocument(previousDoc).get();

endBeforeDocument(特定ドキュメントの直前までを読み込む)

最新順に並べ替え、nextDoc の直前までのドキュメントを読み込む
final nextDoc = await _store.collection('users').doc(id).get();
await _store.collection('users').orderBy('createdAt', descending: true).endBeforeDocument(nextDoc).get();

limit(取得数の制限)

limit(指定した数だけ取得する)

「users」 からドキュメントを 20 個取得
final _store = FirebaseFirestore.instance;
await _store.collection('users').limit(20).get();

limitToLast(並べ替えた時の「最後の要素」から指定した数だけ取得する)

「users」を若い順に並べた時の最高齢者までの 20 個を取得する
  final _store = FirebaseFirestore.instance;
  await _store.collection('users').orderBy('age').limitToLast(20).get();
  • limitToLast クエリには orderBy 句が必須です(もし orderBy を指定していない場合 AssertionError が投げられます)

count(集計)

「users」のドキュメント数を取得
final _store = FirebaseFirestore.instance;
final snapshot = await _store.collection('users').count().get();
final usersLength = snapshot.count;

withConverter(参照を type-safe に扱う)

final usersRef = FirebaseFirestore.instance
    .collection('users')
    .withConverter(
        fromFirestore: (snap, _) => User.fromJson(snap.data()!),
        toFirestore: (user, _) => user.toJson(),
    );
final snap = await usersRef.get();
final List<User> users = snap.docs.map((doc) => doc.data()).toList();

参考

https://firebase.flutter.dev/docs/firestore/usage/#querying

https://zenn.dev/tentel/articles/ea7d5c03e68e6d142d98

https://github.com/firebase/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/query.dart

GitHubで編集を提案
Flutter大学

Discussion