我有这个数据集:
authors - {name: "Author One"}
|_ categories - {label: "Category One"}
|_ books - {title: "Book One"}
而且我想查询只有“Author One”的所有书籍。
我尝试使用 db.collectionGroup("books")
但它查询所有作者的所有书籍。这是路径 /authors/:authorId/books
,:authorId
将是作者的文档 ID。
如何通过文档 ID 查询作者的所有书籍?
答案 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()