Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase多范围查询解决方案_Javascript_Firebase_Google Cloud Firestore_Angularfire2 - Fatal编程技术网

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时间戳作为它们的值,以便它们可以被索引。