3 回答

TA貢獻1875條經驗 獲得超3個贊
我相信有一些更好的方法可以獲取您想要的數據:
將您的 Firestore 重組為只有一個messages集合,如以下示例結構:
messages collection
uid
receiverUserId
senderUserId
msg
read
time
使用這種方法,您可以通過執行以下操作來過濾正在查看的文檔,例如當前經過身份驗證的用戶從多個用戶收到的文檔:
firestore.collection("messages")
.where("receiverUserId", "==", authUid)
.onSnapshot(function(querySnapshot) {
//do whatever
});
創建多個偵聽器,每個chats文檔一個,以觀察其后續messages子集合。所以你可以做這樣的未經測試的代碼:
firestore.collection('chats').get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
var eachChatRef = firestore.collection('chats').doc(doc.documentID)
var messagesRef = eachChatRef.collection("messages");
messagesRef.onSnapshot(function(snapshot) {
snapshot.docChanges().forEach(function(messageDoc) {
// Do whatever
});
});
});
});

TA貢獻1802條經驗 獲得超10個贊
查看 CollectionGroups 的文檔 - 將您的偵聽器設置為 .collectionGroup("messages") - 您將必須處理所有不同“聊天”文檔的更改。(提示:每個返回的消息 DocRef 都包含 refPath 字段 - 您可以簡單地解析它以找到“父”聊天文檔的路徑)

TA貢獻1860條經驗 獲得超9個贊
為了擴展到@LeadDreamer 的回答,這對我有用,可以使用以下方法收聽集合中所有文檔的更改collectionGroup:
const unsub = () =>
onSnapshot(collectionGroup(db, "reservations"), (doc) => {
doc.docs.forEach((d) => {
console.log(d.data());
});
});
添加回答
舉報