【问题标题】:How to perform a query for three values where two values includes a range in Cloud Firestore (cloud_firestore: ^0.13.4+2)如何查询三个值,其中两个值包含 Cloud Firestore 中的范围(cloud_firestore:^0.13.4+2)
【发布时间】:2020-12-08 18:39:47
【问题描述】:

我正在编写一个应用程序,其中一个用户可以根据以下标准过滤其他用户:一个范围内的年龄、一个范围内的体重和排名。

我遇到的问题是只过滤了列出的值之一。 .where .where .where 链接可能不起作用,在https://firebase.google.com/docs/firestore/query-data/queries#compound_queries 它说应该使用命令 whereEqualTo。但是,我的 IDE 无法识别此命令。

有谁知道我如何编写这样的查询?我没有列出代码示例,因为我很欣赏通用方法。我在互联网上找不到任何关于它的信息。

提前感谢您的帮助!

这是我的代码:

query() {
if (currentUser.rank == 'Gold') {
  return docRef
      .where('Rank', isEqualTo: 'Gold')
      .where('age',
          isGreaterThanOrEqualTo: int.parse(currentUser.ageRange['min']))
      .where('age',
          isLessThanOrEqualTo: int.parse(currentUser.ageRange['max']))
      .orderBy('age', descending: false);
} else if (currentUser.rank == 'Silver') {
  return docRef
      .where('Rank', isEqualTo: 'Silver')
      .where('age',
          isGreaterThanOrEqualTo: int.parse(currentUser.ageRange['min']))
      .where('age',
          isLessThanOrEqualTo: int.parse(currentUser.ageRange['max']))
      .orderBy('age', descending: false);
} else if (currentUser.rank == 'Bronze') {
  return docRef
      .where('Rank', isEqualTo: 'Bronze')
      .where('age',
          isGreaterThanOrEqualTo: int.parse(currentUser.ageRange['min']))
      .where('age',
          isLessThanOrEqualTo: int.parse(currentUser.ageRange['max']))
      .orderBy('age', descending: false);
}
}

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    如果没有看到代码示例,很难给出适当的解决方案。但是阅读您上面包含的链接,您不能在不同的字段上使用范围过滤器。听起来您正在尝试这样做。这是由于 Firestore 数据库的限制。您必须找出另一种仅使用相等运算符进行过滤的方法。或者 1 个相等过滤器和 1 个范围过滤器的组合(如下所示)。

    更简单的做法是在从数据库中获取结果后进行过滤客户端,在 Flutter(客户端)中过滤结果。但请注意,这可能会导致与 Firestore 之间传输更多数据,这可能会花费您更多的云费用。

    您可以在 Firestore 查询中进行尽可能多的过滤:

    var result = firestoreInstance
      .collection("users")
      .where("rank", isEqualTo: "1")
      .where("age", isGreaterThan: 40)
      .get();
    

    颤振/客户端:

    var resultsFilteredByWeight = result.docs.where((result) => result.weight >= 100 && result.weight <= 150);
    

    如果没有可行的示例,我不确定我的语法是否正确,但这应该让您知道该怎么做。

    【讨论】:

    • 谢谢@jaredbaszler,这对我了解firestore中的查询选项有所帮助!我将我使用的代码添加到我的问题中。请你看看它并告诉我,我到底能做什么。 :)
    • 当然只是为了同时查询排名和年龄。我明白你说的,firestore 不支持按范围查询不同的值。
    • 但我认为我的 where where 方法不是正确的方法,因为当我编译它时,它没有显示任何错误,但没有在应用程序中显示任何内容...: (
    • 根据您上面的代码,您仍在通过range 查询两个不同的字段。您不能在 ageweight 字段上使用 isGreaterThanOrEqualTo。您必须只在一个字段上使用它,然后像我上面解释的那样在客户端过滤另一个。你不会得到任何编译时错误,因为这些只是 Firestore 的限制。
    • 是的,我明白你告诉我的。但我的问题是,即使我只是查询 Rank 和年龄范围,可能应该起作用的方法会导致不会显示任何信息。我改变了我的代码,只让排名和年龄范围超过,但它给了我相同的结果。我不明白。我编辑了上面的代码,向您展示我是如何测试它的。这个问题让我很困惑……
    【解决方案2】:

    我想出了解决办法。对于所有对 Firestore 中的查询有疑问的人,IDE(例如 Android Studio 或 Xcode)会在 RUN 中显示由您的查询引起的错误。就我而言,Cloud Firestore 中没有激活多索引方法,所以当然什么都没有显示给我。为此,您只需单击 RUN 中显示的链接,您将被直接重定向到 Firestore,Firestore 将为您进行必要的更改,非常用户友好!我还用我的原始代码再次测试了它,它说的和 jaredbaszler 已经说过的一样。不可能在两个单独的值中进行范围查询。但是,可以在一个值中进行范围查询并将其链接到另一个值查询(与 .where .where .where 的简单连接)。我还没有测试可以链接多少其他值,但是另一个可以正常工作。我认为有可能增加更多。我希望我能够帮助其他有问题的人。再一次,非常感谢@jaredbaszler 给了我正确的心态来解决问题! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      相关资源
      最近更新 更多