如何查询 Firestore 子集合的文档数据?

时间:2021-07-16 17:56:37

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

我有这个数据集:

authors - {name: "Author One"}
|_ categories - {label: "Category One"}
   |_ books - {title: "Book One"}

而且我想查询只有“Author One”的所有书籍。

我尝试使用 db.collectionGroup("books") 但它查询所有作者的所有书籍。这是路径 /authors/:authorId/books:authorId 将是作者的文档 ID。

如何通过文档 ID 查询作者的所有书籍?

1 个答案:

答案 0 :(得分:2)

这在使用 NoSQL 时并非微不足道,但有多种策略可以实现:

=>“反规范化”您的数据 - 在每个子文档中包含 authorId 几乎没有成本,允许您执行简单的 collectionGroup 查询来识别那些作者“拥有”。

=> 我会注意到,如图所示,您的“书籍”的路径实际上是 /authors/:authorId/categories/:categoryId/books/:bookId,但这需要特定的 authorId 和 categoryId。

=> 我已经使用的技术(实际上内置到我在 npm 上为自己构建的包装库中,@leaddreamer/firebase-wrapper)利用了 FieldPath {{1 }}(或者,“__name__”)实际上将 FULL PATH 匹配到文档,而不仅仅是单个 documentId(参见此处 Firestore collection group query on documentId):

代码前注意

这个 hack 在 fullpath/documentId() 字段路径上使用了不等式。因此,它限制了其他 documentId() 子句,并且所有不等式都必须在同一字段上。并非在所有情况下都有效;另一方面,我在深度树状结构的数据库中相当广泛地使用它。

.where()