google firestore 上的链式查询

Posted

技术标签:

【中文标题】google firestore 上的链式查询【英文标题】:chained query on google firestore 【发布时间】:2021-10-05 04:27:26 【问题描述】:

我们的一个应用程序用例的数据以下列格式存储在 Firestore 中:

"Collection" : "ROOT_COLLECTION"
     "Documents" : MAIN_ID_1 : attribute : is_enabled:1
                               "subcollection": "Sessions"
                                               Documents : Session_1: attribute: is_merged:false
                                                           Session_2: attribute: is_merged:true
                                                           Session_3: attribute: is_merged:false
                   MAIN_ID_2 : attribute : is_enabled:2
                               "subcollection": "Sessions"
                                               Documents : Session_4: attribute: is_merged:false
                                                           Session_5: attribute: is_merged:true
                                                           Session_6: attribute: is_merged:true
                   MAIN_ID_3 : attribute : is_enabled:1
                               "subcollection": "Sessions"
                                               Documents : Session_7: attribute: is_merged:true
                                                           Session_8: attribute: is_merged:true
                                                           Session_9: attribute: is_merged:true
                   MAIN_ID_4 : attribute : is_enabled:1
                               "subcollection": "Sessions"
                                               Documents : Session_10: attribute: is_merged:false
                                                           Session_11: attribute: is_merged:false
                                                           
                   ......
                   

在这里,我们希望在单个查询中从根集合文档中查找 is_enabled 为 true 和 is_merged 为 false 的所有最后一级会话,以便我们可以将侦听器置于所有检索到的会话之上。

查询:在根集合中的文档上启用 is_enabled:1 is_merged 在会话集合中的文档上:false

Result 应该是会话文档: 会话1,会话3,会话7,会话8,会话9

如何使用来自 firestore 和监听器的单链/组合查询来实现这一点?

【问题讨论】:

【参考方案1】:

查询只能针对单个集合或同名集合执行。查询只能考虑返回的文档中的数据,无法查看其他文档中的数据。

结合起来,这两个限制意味着您的用例不能作为对当前数据模型的单个查询来实现。

您的选择是:

要么首先在***文档中查询具有正确值 is_enabled 的文档,然后循环遍历结果,并在其 sessions 中查询与 is_merged:false 匹配的文档。 或者您可以将来自is_enabled 的数据复制到每个基础sessions 文档中,并在所有sessions 子集合中使用collection group query 执行查询。

两者都没有比另一个更好。像往常一样,在处理 NoSQL 数据库时,您需要在增加的数据存储和更复杂的数据模型之间进行权衡,以换取更快、更简单的查询。

【讨论】:

感谢您的回答 Frank 我们也在考虑您分享的方向。只是想要专家意见来检查是否还有一些选项可以使用我们拥有的模式执行此操作。您的反馈将帮助我们做出明智的决定。【参考方案2】:

我不会尝试使用这种结构来完成这项工作。这并不容易,而且有更好的方法。

您似乎陷入了将 Firestore 用作关系数据库而不是文档存储的陷阱。

如果您想保留此结构,那么我建议添加云功能或在更新子集合中的会话时更新***文档的东西。这样,您可以在其中输入 contains_unmerged_session: Bool 之类的值。不过这感觉很老套。

一种可能的更好方法是拥有一个***集合sessions,然后在每个会话中存储对会话文档中父级的引用。从你的问题很难看出这种关系是如何运作的,但这可能就是我会做的。

在 Firestore 中执行任何操作的最佳方法是按照您希望在客户端上获取数据的方式构建数据。如果结构难以查询...更改结构。

【讨论】:

非常有效的建议 Fogmeister,感谢您的回答。

以上是关于google firestore 上的链式查询的主要内容,如果未能解决你的问题,请参考以下文章

一次在 Google Firestore 中查询多个 ID

尝试在 google Firestore 中跨集合查询 [重复]

如何从 FireStore 查询文档名称?

在 Google Firestore 中处理查询游标的正确方法? (Vue/Nuxt.js)

Google Firestore 是 Google Cloud Datastore 的子集还是超集?

使用Java和Google的Firestore运行Query时没有输出