React Native中Firestore含嵌套子集合的文档删除无响应无报错问题
问题根因
- 你删除操作指定的消息文档ID不存在:创建
messages子集合下的文档时用了add()方法,该方法会自动生成随机唯一ID作为消息文档的ID,而非你传入的chatId。你后续用chatId作为消息文档ID去执行删除,实际是在删除一个不存在的文档,Firestore默认对删除不存在文档的操作不会抛出异常,因此没有任何反馈。 - 你当前的删除逻辑只尝试删除单条消息文档,就算ID正确也无法删除整个
messages集合,更不会删除上层的ChatRoom父文档。
正确删除实现方案
场景1:删除单条消息
你需要拿到对应消息实际的文档ID才能执行删除,查询消息列表时会返回每条消息的自带ID,示例代码:
// 查询消息列表时获取文档ID const messageSnapshot = await firestore().collection('ChatRoom').doc(chatId).collection('messages').get() messageSnapshot.forEach(doc => { const msgId = doc.id // 这才是消息实际的文档ID // 删除单条消息就用这个ID await firestore().collection('ChatRoom').doc(chatId).collection('messages').doc(msgId).delete() })
场景2:删除整个ChatRoom(包含所有子集合)
Firestore不支持自动级联删除,你需要先遍历删除所有子集合下的文档,再删除父文档:
async function deleteChatRoom(chatId) { // 1. 删除messages子集合下的所有文档 const messagesRef = firestore().collection('ChatRoom').doc(chatId).collection('messages') const messageBatch = firestore().batch() const messageSnapshot = await messagesRef.get() messageSnapshot.forEach(doc => { messageBatch.delete(doc.ref) }) // 批量提交删除消息 await messageBatch.commit() // 2. 删除上层ChatRoom文档 await firestore().collection('ChatRoom').doc(chatId).delete() }
提示:如果子集合文档数量超过500条,需要拆分批量操作,每次批量操作最多支持500条写入/删除请求。
内容的提问来源于stack exchange,提问作者Ginxxx
相关产品推荐
相关产品推荐

