簡體   English   中英

來自 firebase firestore 的 Streambuilder,具有高級過濾功能

[英]Streambuilder from firebase firestore with advanced filtering

基於flutter中新版本的firebase依賴,新增了isNotEqualTo、arrayContains、arrayContainsAny、whereIn等過濾器

我嘗試使用一些過濾器創建 streambuilder,我想獲得符合這些條件的文檔。

  1. “uid”字段值不等於當前 uid。 (不等於)
  2. “學校”字段值isEqualTo當前用戶學校。(isEqualTo)
  3. “隨機”字段值 isGreaterThanOrEqualTo 應用程序生成的隨機數 (isGreaterThanOrEqualTo)

stream: fireStore.collection(USERS_COLLECTION).where(UID_FIELD, isNotEqualTo: me.uid).where(SCHOOL_FIELD, isEqualTo: me.school).where(RANDOM_FIELD, isGreaterThanOrEqualTo: random).limit(10).snapshots(),

條件 1 (isNotEqualTo) 對我不起作用,但條件 2 和條件 3 工作正常,當我添加過濾器 1 時,向我顯示錯誤。

具有不等式(<、<=、> 或 >=)的所有 where 過濾器必須在同一字段上。 但是您在“FieldPath([uid])”和“FieldPath([random])”上有不等式過濾器。 'package:cloud_firestore/src/query.dart':斷言失敗:第 486 行 pos 18:'hasInequality == field'

那是 Firestore 限制https://firebase.google.com/docs/firestore/query-data/queries

請注意:= 查詢的以下限制:

只有存在給定字段的文檔才能匹配查詢。 您不能在復合查詢中組合 not-in 和.=,在復合查詢中,范圍(<、<=、>、>=)和.= 比較必須都在同一字段上進行過濾。

因此,您可以在 uid 上使用.= 進行過濾,也可以在 Random 上使用 >= 進行過濾。 您不能在同一個查詢中同時執行這兩項操作。

我建議在沒有 UID 的情況下進行過濾,並在您收到快照后讓您的存儲庫稍后過濾掉 UID。

實際上,您可以通過創建復合索引來過濾多個字段。

Cloud Firestore 使用復合索引來支持單字段索引尚不支持的查詢。

由於存在大量可能的字段組合,Cloud Firestore 不會像為單字段索引那樣自動創建復合索引。 相反,Cloud Firestore 可幫助您在構建應用時識別和創建所需的復合索引。

如果您在未先創建所需索引的情況下嘗試執行上述查詢,Cloud Firestore 會返回一條錯誤消息,其中包含一個鏈接,您可以按照該鏈接創建缺失的索引。 每當您嘗試索引不支持的查詢時,都會發生這種情況。 您還可以使用控制台或使用 Firebase CLI 手動定義和管理復合索引。 有關創建和管理復合索引的更多信息,請參閱管理索引。

https://firebase.google.com/docs/firestore/query-data/index-overview#composite_indexes

此外,如果在您的代碼中從快照調用requireData ,您將在日志中看到一個直接鏈接,用於在 Firebase 上創建該索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM