🔥
【Flutter×Firebase】Cloud Firestoreクエリ一覧
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();
参考
GitHubで編集を提案
Discussion