由子文档或集合完成创建时未触发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。当字段位于不同文档中时如何触发

在 Cloud Firestore 中更新集合名称

我可以获取从 Firestore 集合组查询中获取的文档的路径或引用吗?

扑。创建 Firestore 文档和集合的 List<String>

如何按创建日期而不是名称对 Cloud Firestore 集合中的文档进行排序?

Firestore,检测添加到集合中的新文档等