【问题标题】:Firebase multiple range query work around [duplicate]Firebase多范围查询工作[重复]
【发布时间】:2018-04-22 11:35:30
【问题描述】:

我有以下查询以根据所需类别返回项目列表,并且创建日期大于或等于我提供的值。

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:

什么是解决这个问题的好方法?

【问题讨论】:

  • 你试过删除.orderBy("createdAt", "asc")会得到什么结果吗?我怀疑结果可能已经排序,因为数据库服务器无论如何都需要对createdAt 进行排序以对其进行过滤。
  • 它仍然无法工作,因为 firebase 只允许在每个查询的一个字段上进行范围比较

标签: javascript firebase google-cloud-firestore angularfire2


【解决方案1】:

您正在尝试过滤required.programming 中的范围和"createdAt" 中的范围。正如 Firestore 告诉你的那样,那是行不通的。

为了能够保持其性能保证,Firestore 必须能够在索引的单个范围内找到您的结果。如果您尝试像您正在做的那样过滤两个不相关的字段,这是不可能的。

对此没有简单的解决方法,否则它可能已经在数据库本身中实现了。

【讨论】:

  • 是的。我的应用程序查找具有某些标签的结果,例如编程或运动等。这些不能进入。一个作为 firebase 的数组无法处理它,因此根据文档,我将它们放在一个以 UNIX 时间戳作为其值的对象中,以便它们可以被索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多