【发布时间】:2020-06-21 09:02:40
【问题描述】:
我一直在阅读博客文章 https://firebase.googleblog.com/2019/06/understanding-collection-group-queries.html 以更好地理解 collectionGroup 查询。
尽管如此,我仍然有一个问题:如何将结果限制为特定的祖先。让我自己解释一下。
想象我有companies 制造cars 有tyres。我们有不同品牌的tyres,用于不同的cars。最后,我们有一个多对多的关系。我知道我不应该在 NoSQL 世界中使用这个术语,但我称狗为狗 :-)
无论如何,我的问题如下:如果某个特定tyre 品牌(比如米其林)的company A 短缺,您需要将此tyre 标记为缺货。我会考虑运行一个 collectionGroup 查询,例如:
db.collectionQuery("tyre")
.where("brand", "==", "Michelin")
.get()
.then(function (querySnapshot) {
// update flag accordingly
})
但这会更新其他companies 的库存。
我的问题是:如何缩小 collectionGroup 查询结果的范围,以便只更新 A 公司的 tyres 信息?
我可以将公司 A docRef 包含在 tyres 集合中,并使用 where() 缩小结果范围。这似乎是一种有效的方法。虽然,它将是顶级集合和子集合之间的混合。这是最佳做法吗?
更新
实际上,我正在效仿餐厅的例子,将我的手放在火力基地/火力店上。一家餐厅可以有多个菜单。一个菜单可以有多个项目。项目可以重复使用,因此出现在多个菜单中。
collection('restaurants').doc(..).collection('menus').doc(..).collection('items')
我认为这是构建数据的最佳方式(相对于项目的顶级集合)。但是像咖啡这样的东西很容易在多家餐厅的多个菜单中找到。如果一家餐厅的咖啡短缺,我如何使用以下方式更新该特定餐厅的咖啡项目:
db.collectionQuery("items")
.where("name", "==", "Coffee")
.get()
.then(function (querySnapshot) {
// set available = false
})
【问题讨论】:
-
您能否提供有关您的数据库结构(集合和子集合及其父/子关系的确切列表)以及您要在其中执行查询的上下文的更多详细信息?
-
嗨@RenaudTarnec 我已经更新了问题以避免评论大小限制
-
"如何将结果限制为特定的祖先?"你不能。集合组查询当前读取具有给定名称的所有集合。没有办法将它们限制在特定路径上。典型的解决方法是以不同的方式命名集合以允许用例。另见stackoverflow.com/a/58977074、stackoverflow.com/a/61034013、stackoverflow.com/a/56224106
标签: javascript firebase google-cloud-firestore