由子文档或集合完成创建时未触发firestore OnCreate
Posted
技术标签:
【中文标题】由子文档或集合完成创建时未触发firestore OnCreate【英文标题】:firestore OnCreate not triggered when creation is done by a sub document or collection 【发布时间】:2019-11-07 17:13:23 【问题描述】:所以我正在使用flutter和firebase构建一个聊天应用程序,每当两个新用户第一次开始互相聊天时(每当他们中的一个发送第一条消息时)我都需要触发一个函数,以便我可以存储该信息稍后在某个地方将其作为聊天历史记录显示给用户(与之有过联系的人)。
所以我的数据树看起来像这样:'rooms/roomId/messages/messageWithRandomId'
从逻辑上讲,每当用户向另一个用户发送第一条消息时,都会创建房间文档以及包含带有 randomId 的单个消息文档的子集合“消息”。 `
我在房间的集合上设置了一个 OnCreate 侦听器,每当我在“房间”下手动创建新文档时都会触发它。
但是当子集合创建同一个文档时它不会被触发。
所以我的代码看起来像这样:
export const testfunction = functions.firestore.document('rooms/_someRoom').onCreate(async (snapshot,context) =>
// the function Core
【问题讨论】:
【参考方案1】:当同一个文档由 子集合。
这是正常行为。
事实上,如果直接在messages
集合下创建一个完整路径为rooms/roomId/messages/messageWithRandomId
的文档,不会创建中间文档(即没有roomId
文档) .
所以,当你说:
room
文档与子集合一起创建messages
包含一个带有randomId
的消息文档
,如果您只创建了带有randomId
的消息文档,实际上没有创建room
文档,因此不会触发云函数。
Firebase 控制台以斜体显示 roomId
房间“文档”作为一种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到 messageWithRandomId
消息文档,但房间文档在 Firestore 数据库中不存在。
让我们举一个更通用的例子:想象在col1
集合下的doc1
文档
col1/doc1/
还有另外一个subDoc1在subCol1(子)集合下
col1/doc1/subCol1/subDoc1
实际上,从技术角度来看,它们之间根本没有任何关系。它们只是共享路径的一部分,没有别的。这样做的一个副作用是,如果您删除一个文档,它的子集合仍然存在。
这意味着您应该:
在rooms
集合下创建自己的roomId
文档
或
触发您的云函数:
export const testfunction = functions.firestore.document('rooms/_someRoom/messages/_someMessage').onCreate(async (snapshot,context) =>
//.....
【讨论】:
感谢您的快速回复和清晰的解释:)以上是关于由子文档或集合完成创建时未触发firestore OnCreate的主要内容,如果未能解决你的问题,请参考以下文章
我可以获取从 Firestore 集合组查询中获取的文档的路径或引用吗?
扑。创建 Firestore 文档和集合的 List<String>