簡體   English   中英

Firebase Firestore 多條件子句或雲函數,Flutter

[英]Firebase Firestore Mulitple Condition Clauses or Cloud Functions, with Flutter

我目前正在使用 Flutter 進行開發,我有一個問題,據我所知,根據 Firebase 文檔:您只能使用一個Array Contains clause執行搜索。

在我的 Firestore 中,我有一個集合,在其文檔中,它有字段 State、城市和區域,這些都應該使用數組包含進行查詢。

我會讓它 go,但另一個程序員提到,通過 CloudFunctions,有一種方法可以獲取 Multiple Array Queries,只是它會更慢。

因此,在一個完美的世界中,我應該能夠查詢區域數組 [Zone1、Zone2、Zone3]、城市數組 [San Diego、Los Angeles、Washington] 和州數組 [CA、WA、NY ] 並顯示結果。

有任何想法嗎?

通過 CloudFunctions,有一種方法可以獲取多數組查詢,只是速度會慢一些。

Cloud Functions 通過 Admin SDK 訪問 Firestore。雖然它是一個單獨的 SDK,但大多數限制來自 Firestore 后端,而不是它的 SDK。在這種情況下,Admin SDK 也只能有一個array-contains子句。

您可能想通過 go 回復該客戶並詢問他們是否可以澄清他們認為如何在這里使用 Cloud Functions。 除了這個突然存在的功能之外,他們可能還有其他想法。

正如@FrankvanPuffelen 在他的回答中提到的,所有限制都來自 Firestore 后端。 因此,無論您使用哪一種,所有 SDK 都具有相同的約束條件。

您只能使用一個 Array Contains 子句執行搜索。

這是完全正確的。

因此,在一個完美的世界中,我應該能夠查詢區域數組 [Zone1、Zone2、Zone3]、城市數組 [San Diego、Los Angeles、Washington] 和州數組 [CA、WA、NY ] 並顯示結果。

是的,但不幸的是,目前這是不可能的。 幸運的是,有一種解決方法可以幫助您獲得相同的結果,但前提是您可以稍微更改文檔的結構。 因此,您可能會考慮使用地圖,而不是使用 arrays。 因此,您的新文檔結構可能與此類似:

$docId
  |
  --- zones (map)
  |    |
  |    --- zone1: true
  |    |
  |    --- zone2: true
  |    |
  |    --- zone3: true
  |
  --- cities (map)
  |    |
  |    --- San Diego: true
  |    |
  |    --- Los Angeles: true
  |    |
  |    --- Washington: true
  |
  --- states (map)
       |
       --- CA: true
       |
       --- WA: true
       |
       --- NY: true

例如,要獲取“states”包含“CA”且“cities”包含“LA”且“zones”包含“zone1”的所有文檔,您可以使用三個連續的 where()調用,如下所示詢問:

Query query = db.collection("collName")
                .where("states", isEqualTo: "CA")
                .where("cities", isEqualTo: "LA")
                .where("zones", isEqualTo: "zone1");
query.get().then(...);

我會讓它 go。

不要這樣做,因為只需要對文檔結構進行簡單的更改。

編輯:

根據您的評論:

如果我發送查詢我只想要一個區域,一個 2 個城市,1 State 有一個區域不在這兩個城市之一,它會工作嗎,例如我想要來自 Zones[Midtown]、Cities[Manhattan, Queens] 的數據, States=[NY] 就像讓中城成為曼哈頓的一個區域並且還顯示皇后區的所有命中但也僅顯示曼哈頓中城的命中?

不,不會的。 你不能經過兩個城市。 但如果您創建兩個單獨的查詢,它將起作用。 第一個是:

Query firstQuery = db.collection("collName")
                .where("states", isEqualTo: "NY")
                .where("cities", isEqualTo: "Manhattan") //First state
                .where("zones", isEqualTo: "Midtown");

第二個:

Query secondQuery = db.collection("collName")
                .where("states", isEqualTo: "NY")
                .where("cities", isEqualTo: "Queens") //Second state
                .where("zones", isEqualTo: "Midtown");

獲得每個查詢的結果后,您就可以在客戶端加入它們。 對於 Android,那將是:

Firestore - 在本地合並兩個查詢

在 Flutter 中,這將是這樣的:

Flutter 將兩個 firestore 流合並為一個 stream

你也可以考慮試試這個:

如何合並 Flutter 項目中的兩個 firestore 查詢以及如何從這兩個流中刪除重復文檔?

和這個:

將 firebase 的兩個不同的 collections 合並到 flutter

僅按“區域”過濾,這將產生您正在尋找的結果。 我在這里猜測您想使用 AND 進行過濾。 如果是這樣,在你的情況下

區域 [Zone1、Zone2、Zone3] 和城市 [聖地亞哥、洛杉磯、華盛頓] 和州 [CA、WA、NY]

等於 Zones [Zone1, Zone2, Zone3] 因為每個文檔都應該像

{ state: 'CA', city: 'San Francisco', zone: 'soma' }

對於您只有 state 和過濾器中的城市的情況,然后過濾城市,當只有州時相同

暫無
暫無

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

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