如何搜索成員映射包含特定內容的檔案map_id
chatRoom: {
MVyMPi78DOwVQ5w5GnYe: {
...
members: {
<member_1_id>: {
id: xxxxx,
unreadmessagecount: xx
},
<member_2_id>: {
id: xxxxx,
unreadmessagecount: xx
}
},
La234Pi78DOwVQ5w5GnYe: {
...
members: {
<member_1_id>: {
id: xxxxx,
unreadmessagecount: xx
},
<member_2_id>: {
id: xxxxx,
unreadmessagecount: xx
}
}
}
members map像上面的結構一樣,獲取所有包含member_id假設member_id已知的
聊天室![子地圖的firestore搜索查詢[在JavaScript中]](https://i.stack.imgur.com/qjETV.png)
uj5u.com熱心網友回復:
您可以使用點表示法基于嵌套欄位查詢檔案,如下所示:
const q = query(collection(db, 'chatRoom'), where('members.user1', '==', {<obj>}))
除非您知道確切的物件,否則這不適用于您的用例,即{ uid: 'user1', unreadMessageCount: 1 }.
作為一種解決方法,您可以使用orderBy()僅回傳該欄位存在的檔案的子句,如下所示:
const q = query(collection(db, 'chatRoom'), orderBy('members.user1'))
但是,這實際上是查詢整個集合,因此撰寫安全規則會有些困難。例如,如果您使用allow read: if request.auth.uid in resource.data.members,則該規則將失敗,因為會有許多檔案回傳 false。
我建議使用將所有成員的 UID 存盤在陣列中,如下所示:
{
...
group: false,
memberIds: ['user_1_uid', 'user_3_uid']
}
然后您可以使用array-contains運算子查詢用戶的所有聊天室,如下所示:
const q = query(collection(db, 'chatRoom'), where('memberIds', 'array-contains', 'some_uid'))
然后,您可以使用以下安全規則來確保只有聊天成員可以讀取/寫入檔案:
allow read, write: if request.auth.uid in resource.data.memberIds
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/519715.html
