因此,我正在使用Flutter和Firebase构建一个聊天应用程序,每当两个新用户首次开始彼此聊天时(无论他们何时发送第一条消息),我都需要触发一个功能,以便我可以存储该信息稍后再将其显示为用户的聊天记录(已联系的人)的地方。
所以我的数据树看起来像这样:'rooms / {roomId} / messages / {messageWithRandomId}'
从逻辑上讲,每当用户向其他用户发送第一条消息时,就会创建会议室文件以及包含单个消息文档(带有randomId)的子集合“消息”。 `
我已经在会议室的集合上设置了一个OnCreate侦听器,每当我在“会议室”下手动创建新文档时就会触发它。
但是当子集合创建相同的文档时,不会触发该事件。
所以我的代码如下:
export const testfunction = functions.firestore.document('rooms/{_someRoom}').onCreate(async (snapshot,context) => {
// the function Core
}
答案 0 :(得分:2)
当文档创建相同的文档时不会触发 子集合。
这是正常现象。
事实上,如果您直接在messages
集合下使用完整路径rooms/{roomId}/messages/{messageWithRandomId}
创建文档,则将不会创建任何中间文档(即不会创建{ {1}}文档。
所以,当你说:
的单个邮件文档
roomId
文档与子集合一起创建room
包含带有messages
,如果仅使用randomId
创建了消息文档,则实际上没有创建randomId
文档,因此不会触发云功能。 >
Firebase控制台以斜体形式将room
会议室“文档”显示为一种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到{ {1}}消息文档,但会议室文档在Firestore数据库中不存在。
让我们举一个更通用的示例:想象一个roomId
集合下的messageWithRandomId
文档
doc1
和subCol1(子)集合下的另一个subDoc1
col1
实际上,从技术的角度来看,它们根本不是相互关联的。它们只是共享其路径的一部分而已。这样做的副作用是,如果删除文档,则其子集合仍然存在。
这意味着您应该:
在col1/doc1/
集合下创建col1/doc1/subCol1/subDoc1
文档
OR
通过以下方式触发您的云功能:
roomId