Firestore - 侦听所有删除操作,而无需下载整个集合("added"接收"modified"事件)



简介

为了在不下载整个收藏的情况下收听我收藏的所有被删除的文档,我正在做与这里评论的相同的事情。

与其完全删除文档,不如添加一个"删除:true";属性,然后监听查询";db.collection("cities"(。其中("deleted","==",true(";

问题

出于某种原因,我不明白,我收到了所有的";修改的";事件为";添加">来自我的Firestore听众。

聊天室删除代码

我正在实现一个带有分页的聊天列表屏幕,所以我只是在安装屏幕时获取旧文档,并订阅new Date()(屏幕安装时间(后每个聊天室文档上发生的所有更改。

对于";删除";聊天室文档,我正在做以下事情:

async function deleteChatRoom(chatRoomId, userId) {
const chatRoomRef = firestore.collection("chats").doc(chatRoomId);
const chatRoomDoc = await chatRoomRef.get();
const chatRoomData = chatRoomDoc.data();
const messagesPath = `${chatRoomRef.path}/messages`;
// Check that the user is member of the room
if (!chatRoomData.members[userId]) {
throw chatErrors.notChatRoomMember();
}

// Delete all the chatroom messages
await deleteCollection(messagesPath);
// Delete the chat room
await chatRoomRef.update({ 
deleted: true, <----
lastMessage: admin.firestore.FieldValue.delete(), // Delete denormalized sensitive data
modifiedAt: admin.firestore.FieldValue.serverTimestamp(), <----
read: admin.firestore.FieldValue.delete(), // Delete denormalized sensitive data
});
}

正如你所看到的,我正在更新";modifiedAt";以及";删除";字段。

侦听器代码

有了这一点,我试图达到的是能够监听客户端new Date()之后发生的所有聊天室更改("lastMessage"字段更新、"read"字段更新和"deletions"…(,正如我之前评论的那样。如下:

export function listenMyChats(
startAt = undefined,
onNext,
onError
) {
const currentUserId = getCurrentUser()?.uid;
if (!currentUserId) {
throw authErrors.authenticationRequired();
}
let query = firestore
.collection("chats")
.where("membersArray", "array-contains", currentUserId)
.orderBy("modifiedAt");
if (startAt) {
query = query.startAt(startAt);
}
return query.onSnapshot(onNext, onError);
}

这对我来说是有意义的,因为我在使用字段"时避免阅读整个集合;startAt";以及";orderBy(modifiedAt(";。

订阅代码

然后,为了处理所有和订阅聊天室的更改,我正在做以下操作:

const handleChatsChanges = async (querySnapshot) => {
const changes = querySnapshot.docChanges();
await Promise.all(
changes.map(async (change) => {
if (change.type === "added") {
// NEW INCOMING CHATS
console.log("Added");
} else if (change.type === "modified") {
// MODIFIED CHATS ("deleted", "read", "lastMessage" fields...) 
console.log("Modified");
}
});
);
};
useEffect(() => {
const listener = listenMyChats(
startAfter.current,
handleMyChatsChanges,
handleOnListenMyChatsError
);
return () => {
listener();
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

我遇到的主要问题是;修改的";范围,我得到";添加";事件。。。为什么会发生这种情况?

我认为侦听器的行为是在订阅时获取与查询条件匹配的所有文档(如"已添加"(。在这之后;添加";只有在将新文档添加到目标集合(当然与查询条件匹配(时,才会执行scope。

那么,为什么我收到的docs字段修改为";添加了";?

如以上注释中所述,问题来自于被修改的Firestore文档在第一个快照中不存在的事实,因为您的侦听器应用于以下查询:

firestore
.collection("chats")
.where("membersArray", "array-contains", currentUserId)
.orderBy("modifiedAt");  

当您修改它们时,它们由上面的查询返回,因此它们被侦听器视为added

如果并且仅当它们包含在设置侦听器后返回的第一个快照中时,它们才会被视为modified

最新更新