Javascript Firebase多范围查询解决方案
我使用以下查询返回基于所需类别的项目列表,并且创建日期大于或等于我提供的值Javascript Firebase多范围查询解决方案,javascript,firebase,google-cloud-firestore,angularfire2,Javascript,Firebase,Google Cloud Firestore,Angularfire2,我使用以下查询返回基于所需类别的项目列表,并且创建日期大于或等于我提供的值 return this.firestore.col$('Items', ref => ref.where(required.programming, '>', 0) .where('name', '==', itemName) .where('createdAt', '>=', this.mostRecentDate) .orderBy("createdAt", "asc")
return this.firestore.col$('Items', ref =>
ref.where(required.programming, '>', 0)
.where('name', '==', itemName)
.where('createdAt', '>=', this.mostRecentDate)
.orderBy("createdAt", "asc").limit(50))
)
由于firebase不查询数组字段,我不得不将数据结构为键对象。firebase提供的解决方案是提供一种结构,其中每个类别都是映射中的键,值是unix时间戳(以便对它们进行索引)
现在的问题是Firebase无法处理不同字段上的多个范围比较
you can only perform range comparisons (<, <=, >, >=) on a single field:
只能对单个字段执行范围比较(=):
解决此问题的好办法是什么?您正在尝试筛选
所需的范围。编程和中的范围“createdAt”
。正如Firestore告诉你的那样,那是行不通的
为了保持其性能保证,Firestore必须能够在索引中的单个范围内找到结果。如果您尝试像现在这样过滤两个不相关的字段,那么这是不可能的
没有简单的解决方法,否则它可能已经在数据库本身中实现了。您是否尝试过删除.orderBy(“createdAt”、“asc”)
?我怀疑结果可能已经排序了,因为数据库服务器无论如何都需要在createdAt
上排序才能对其进行筛选。它仍然无法工作,因为firebase只允许对每个查询的一个字段进行范围比较。我的应用程序查找带有特定标记的结果,如编程或运动等。这些标记无法进入。作为firebase的数组无法处理它,因此根据文档,我将它们放在一个对象中,UNIX时间戳作为它们的值,以便它们可以被索引。