【问题标题】:Order by on missing field constrains result按缺失字段约束结果排序
【发布时间】:2018-11-16 01:12:56
【问题描述】:

我遇到了一个对我来说非常不直观的 Firestore 问题,所以我想知道是否有人可以帮助我理解 Firestore 给出这个结果的原因。

假设我有一个名为“people”的集合,其中包含“firstName”和“lastName”字段。假设我在该集合中有 20 个文档,其姓氏为“Quaid”。然后我有一个字段“inCanada”,它只出现在这 20 个文档的一个子集中,比如说 5 个。其他 15 个文档没有该字段。

令人惊讶的是,使用该可选字段的 orderBy 子句实际上是在过滤结果集,而不仅仅是对结果集进行排序,与其他数据库相比,这对我来说没有意义。

在下面的示例中,我希望两个结果集都有 20 个元素,但是具有 orderBy 的第二个结果集只有存在该字段的那 5 个文档。

有人可以解释为什么 Firestore 会这样做吗?

const Admin = require('firebase-admin');

(async function () {
  const initFirebase = require('../initFirebase');
  initFirebase();

  const people = Admin.firestore().collection('people');
  const quaids = people.where('lastName', '==', 'Quaid')
  const quaids1 = await quaids.get();
  const quaids2 = await quaids.orderBy('inCanada', 'desc').get();

  console.log(quaids1._size); // 20
  console.log(quaids2._size); // 5
})();

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    简而言之,这是因为 Firestore 查询是基于索引的:每次创建文档时,Firestore 都会为文档的每个字段创建一个索引。

    因此,由于“inCanada”字段仅存在于“20 个文档的子集中”,因此“inCanada”索引中仅存在此文档子集,从而导致了您提到的情况。

    来自 Firebase 团队的 Todd Kerpelman 的官方视频很好地解释了这一点:https://www.youtube.com/watch?v=Ofux_4c94FI#t=4m17s。 (此链接将在 4 分 17 秒打开视频,即开始对索引机制的解释。但是索引对查询可能性的影响部分更多的是在 6 分 22 秒左右!)

    如果您想在查询结果中包含其他文档,您应该为这些文档的“inCanada”字段写入一个值,例如使用 false 值(对于“在加拿大”)。

    【讨论】:

    • 嗨雷诺!我认为 OP 添加进行此解释的特定最小值会有所帮助。您可以在网址末尾添加类似#t=6m22s 的内容。
    • @AlexMamo 嗨,Alex,好建议,谢谢!我已经修改了答案。
    • 是的,我知道索引是如何工作的,我的问题更多的是为什么而不是如何。让 orderBy 影响没有指定任何限制的结果集的大小似乎是一个非常尴尬的设计决定。不管怎样,谢谢你的回答。
    • 这在无模式数据库中尤其尴尬,因为您不能依赖集合的所有对象上是否存在给定字段。我已经为 Firebase 支持填写了一个错误。
    • 我从 firebase 支持中得到了答案:由于查询使用索引的方式,目前确实不支持,但他们为此创建了一个功能请求。所以这可能会在未来得到支持。
    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多