当前位置: 首页 > 面试题库 >

在两个字段上同时使用firestore.where()

隆向晨
2023-03-14
问题内容

我有以下文件的仓库集合:

[
  {
    start:       { geohash: 'u3qchtmpuy2d' },
    destination: { geohash: 'u3qcjvxfh9cs' },
    timestamp:   '28 June 2019 at 20:24:00 UTC+2',
    ...
  }
]

我试图像这样查询它(其Firestore Web SDK)

// 5-characters geohash is 4.89km × 4.89km
const start = 'u3qch';
const destination = 'u3qcj';
const timestamps = {
  min: firestore.Timestamp.fromDate(
    moment(someDateTime).subtract(10, 'minutes').toDate()
  ),
  max: firestore.Timestamp.fromDate(
    moment(someDateTime).add(10, 'minutes').toDate(),
  ),
};

firestore
  .collection('deliveries')
  .where('start.geohash', '>=', start)
  .where('start.geohash', '<', geohashEnd(start))
  .where('destination.geohash', '>=', destination)
  .where('destination.geohash', '<', geohashEnd(destination))
  .where('timestamp', '>=', timestamps.min)
  .where('timestamp', '<', timestamps.max)
  .get()

>=and
的组合<来自Firestore:通过startsWith字符串查询文档,因此geoHashEnd()具有功能(不在此问题范围内)。

它导致以下错误:

FirebaseError:无效查询 。不等式(<,<=,>或>
=)的所有过滤器必须位于同一字段上。但是您在’start.geohash’和’destination.geohash’上有不等式过滤器

我的问题:通过两个geohash字符串和一个附加字段一次查询我的Firestore集合的最佳方法是什么?


问题答案:

根据有关查询限制的官方文档:

查询限制

Cloud Firestore不支持以下类型的查询:

  • 如上一节所述,在不同字段上具有范围过滤器的查询。

因此,您可以看到,Cloud Firestore 只能
对单个字段执行范围过滤,而不能按预期对多个字段进行范围过滤。最合理的解释是,在这种情况下,Firestore无法保证其性能。Firestore必须能够在单个流中返回查询的所有结果。

为了解决这个问题,您必须对数据库查询两次,并在客户端合并这些查询的结果。这不是完美的,因为您需要查询两次,但我认为它将成功。

另请注意,在地理哈希上使用范围过滤器进行查询不会返回非常准确的结果。为此,我建议您观看Frank Van Puffelen关于该主题的精彩视频:



 类似资料:
  • 我想上传两个或更多的图片,使用一个表单在不同的领域到数据库使用Codeigniter。 但是这里只有一个正在上传...有人能帮我吗... 我的控制器 这是我的模型 这是我的看法 我的数据库 请帮我上传到单独的数据库字段作为两个单独的文件

  • 问题内容: 我想做类似于“和”过滤器示例的操作,除了每个示例中都带有“应该”的术语,而不是示例中的字段类型。我提出以下内容: 但是,我收到此错误: 还有另一种方法可以执行我正在尝试执行的操作,还是我走在正确的轨道上?还是在Elasticsearch中这是不可能的? 问题答案: 每个布尔查询子句可以包含多个子句。字词查询(http://www.elasticsearch.org/guide/refe

  • 问题内容: 我的mysql数据库中有一个表,该表有两列:组和子组。见下文。 我正在尝试获取每个唯一的夫妇组/子组的记录数。 这是我期望的: 阅读一些帖子后,我尝试使用count()的group by尝试了几个sql查询,但是我无法获得预期的结果。我怎样才能解决这个问题? 问题答案: 我认为您正在寻找:

  • 我使用Spring 5.1.4。RELEASE,在bean配置方法上使用@Profile注释时,无法通过构造函数注入相同接口的两个字段。我有一个简单的Publisher组件,如下所示: 当我使用@Profile注释标记整个配置时,它会按预期工作: 上面的配置是可以的,但是当我只想在配置类中的某些方法上使用@Profile注释时就会出现问题: 然后我在启动过程中出错: 更新:已经解决了。这是我的错误

  • 问题内容: 我有两个表和字段。我想同时参加这两个领域。我试过了 可以,但是非常慢。有一个更好的方法吗? 问题答案: