簡體   English   中英

Firestore:如何通過存在於其他集合中來過濾文檔?

[英]Firestore: how to filter documents by existing in other collection?

例如,我想獲取屬於某個“空間”的所有用戶。

簡化的 Firestore 規則示例:

match /users/{userId} {
  allow read: if exists(/databases/$(database)/documents/spaces/SPACEID/members/$(userId));
}

網站中的JS代碼:

firebaseApp
    .firestore()
    .collection("users")
    .where( ??? )
    .onSnapshot((querySnapshot) => {
        ...
    });

我只能想出兩個工作選項:

  1. /users集合中創建spacesArray字段並使用usersRef.where("spacesArray", "array-contains", "SPACEID") 但在這種情況下,任何人都可以通過讀取spacesArray來找出用戶所在的組。 此外,問題在於這些數組可能非常大,而客戶端不需要這些數據,這會導致流量過多。
  2. 先獲取空間中的所有成員列表/databases/$(database)/documents/spaces/SPACEID/members/並一一獲取每個用戶。 這個選項的問題在於可能有很多用戶,每次刷新頁面時,都會通過.get().onSnapshot()請求成百上千的用戶,這是多余的。

理想的選擇是使用where字段中的規則中的exists(...)方法的類似物,或者出於保密目的以某種方式從用戶文檔中過濾掉spacesArray

Firestore 查詢只能對作為查詢返回的文檔的一部分的數據進行排序/過濾。 無法對另一個文檔/集合中的信息進行排序/過濾。

因此,安全規則中的exists檢查通常非常適合獲取單個文檔(在更細粒度的安全規則語法中稱為get ),但不適用於處理批量讀取(在細粒度安全規則中稱為list )。

如果您考慮用戶私人信息的空間列表,請考慮將其存儲在UserSpaces集合中,這(如您在 #2 中所說)會導致更多讀取,或者考慮僅存儲公共空間的單向哈希大批。

暫無
暫無

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

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