【发布时间】:2020-07-09 22:43:20
【问题描述】:
我的 Firestore 查询技术目前存在一些问题。根据我最近发布的这篇 stackoverflow 帖子,Querying with two array with firestore security rules
答案建议将“ids”添加到对象中,键为id,值简单地为“true”。我已经完成了这个,现在我的结构是这样的:
这给我留下了这个查询:
db.collection('Depots')
.where(`products.${productId}`, '==', true)
.where(`users.${userId}`, '==', true)
.where('created', '>', 1585998560500)
.orderBy('created', 'asc')
.get();
这个查询让我抛出一个错误,要求创建一个索引:
查询需要索引。你可以在这里创建它:...
但是,这会尝试索引特定的对象键,即QXooVYGBIFWKo6C 所以products.QXooVYGBIFWKo6C。这当然不是我想要的,因为这个查询会发生变化,并且可能有无数种可能性,这意味着我必须为每个键条目创建另一个索引才能查询它。
有什么办法可以解决这个问题吗?由于查询中使用了不同的运算符,我假设它需要为此查询建立索引,所以我想知道是否有任何解决方法来解决这个问题。
非常感谢您。
【问题讨论】:
-
很遗憾,我看不出这个结构如何被扁平化为一个索引。 “用户”的目的是什么?如果您可以将其转换为“user0 = someId”和“user1 = someOtherId”,您可能需要进行两次查询,但您可以保留产品密钥的数组包含(您将对
where('user0', '==', userId)使用一个查询,另一个where('user1', '==', userId)然后在客户端合并结果)。 -
@samthecodingman 我觉得这有点乱 - 我不知道每个文档会有多少用户,所以我不想将密钥硬编码为特定数量的每个项目的用户数。
-
我知道它很乱——我的意思是要证明它不能被展平成一个单一的索引。我给出的示例将其展平为仅两个索引。
-
您最终想要实现/查询什么?什么是理想的查询案例?我不知道怎么会有这么多答案,甚至没有人问过你这个问题。
-
@bsod 当我查询时,程序中需要文档中的其他数据 - 我删除了它,因为它对问题没有帮助,并且两个地图不适合窗口让我截图。
标签: javascript firebase google-cloud-firestore firebase-authentication