【问题标题】:Is there a work-around for the limited firebase query capabilities有限的firebase查询功能是否有解决方法
【发布时间】:2020-09-27 19:06:00
【问题描述】:

我正在构建一个包含许多过滤器的约会应用。这是查询:

findMatch(itinerary: IItinerary): void {

    const findMatchQuery = this.matchSvc.getMyMatch()
      .where('location', '==', itinerary.location)
      .where('endDay', '>=', itinerary.startDay)
      .where('gender', '==', itinerary.searchGender);

    findMatchQuery.get()
      .then(listSnapshot => {
        this.matches = [];

        listSnapshot.forEach(async snapshot => {
          let age = moment().diff(snapshot.data().dateOfBirth, 'years');
          if ((snapshot.data().startDay <= itinerary.endDay) && (!this.dontShowList.includes(snapshot.id))) {
            if ((age <= itinerary.ageRange.upper) && (age >= itinerary.ageRange.lower) && (snapshot.id !== itinerary.id)) {
              this.matches.push({
                  snapshot.data(),
                photoUrl: await this.getUserPhoto(snapshot.data().userId)
              });
            }
          }
        });
      });
  }

我意识到我在这里做的不好,但我不知道另一种方法可以做到这一点,因为你不能使用多个不等式运算符。

我必须使用 ('endDay', '>=', itinerary.startDay),但我还需要按年龄过滤,因此我使用 if 语句来按年龄过滤:

让年龄 = moment().diff(snapshot.data().dateOfBirth, 'years');

if ((age = itinerary.ageRange.lower)

这是为了确保我只将处于所需年龄范围内的用户添加到列表中。我希望能够将我的查询限制为 1,并且当用户向左或向右滑动时,再次查询 firebase 以获取另一个用户。我无法限制,因为我在查询之外使用 if 语句来根据用户所需的搜索进一步过滤列表。

假设我有来自 firebase 的 5 个限制。但是,这 5 个用户中没有一个属于该年龄范围。从 firebase 的角度来看,我有 5 个用户……firebase 不知道这 5 个用户被 if 语句进一步过滤,并且用户列表为空。如果我能够使用 limit() 选项,我需要我的整个查询使所有过滤器生效,这样我就不必从 firebase 中提取每条记录。

除了年龄过滤器之外,我实际上是在过滤一个日期范围……但同样,我只能在查询中使用一个不等式运算符。所以我对以下内容也有一个 if 语句: if ((snapshot.data().startDay

所以我在这里做的是寻找一个日期范围。这就是我想做的:

      .where('location', '==', itinerary.location)
      .where('endDay', '>=', itinerary.startDay)
      .where('gender', '==', itinerary.searchGender)
      .where('startDay', '<=', itinerary.endDay)
      .where('age', '>=', itinerary.minimumAge)
      .where('age', '<=', itinerary.maximumAge);

显然我不能使用上面的查询,我正在使用 if 语句来进一步过滤,但我想鉴于这些 if 语句,我无法使用 limit() 函数,但我想我会先问案例。

谢谢

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    除非您有某种方法可以将所有范围查询组合到一个字段中,否则您无法真正绕过 Firestore 查询限制。您可以做的是将一些过滤卸载到客户端应用程序。因此,您可以应用删除大部分文档的范围过滤器,然后让客户端应用删除所有其他不需要的文件。

    您可以通过让后端进行查询并在将结果发送回客户端之前进一步过滤结果来加快此过程。这将节省传输不需要的文档所需的时间。

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多