【问题标题】:How is the order of the fields in firestore composite indexes decided?firestore 复合索引中字段的顺序是如何决定的?
【发布时间】:2021-07-01 21:28:21
【问题描述】:

这是我的查询:

db.requests
      .where('userId', '==', uid)
      .where('placeId', '==', placeId)
      .where('endTime', '>=', Date.now())
      .where('isFullfilled', '==', false);

所以我在firestore.indexes.json手动写了这个索引:

    {
      "collectionGroup": "requests",
      "queryScope": "COLLECTION",
      "fields": [
        {
          "fieldPath": "userId",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "placeId",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "endTime",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "isFullfilled",
          "order": "ASCENDING"
        }
      ]
    },

运行时,我收到错误“此查询需要索引”。自动创建的索引如下所示:

另一方面,我手动创建的索引在 GUI 中如下所示:

为什么它不接受我自己的索引?字段的顺序重要吗?我没有订购查询结果。是否有任何类型的索引创建模式?这真的很令人困惑,我在文档中找不到任何内容。必须对云数据库运行每个查询才能获得正确的复合索引字段顺序,这真的很烦人。

【问题讨论】:

    标签: firebase indexing google-cloud-firestore


    【解决方案1】:

    字段的顺序重要吗?

    是的,字段的顺序对结果索引非常重要。我几乎看到这样的索引:

    1. Firestore 通过连接索引中的字段值为每个文档创建一个复合值。
    2. 对于查询,它只能查询字段和顺序是否完全匹配(字段子集的一些例外情况,以及它可以执行 zig-zag-merge-join 的情况)。
    3. 对于此类查询,Firestore 会在索引中找到与条件匹配的第一个条目。然后从那里返回连续的结果(有时称为切片)。它不会跳过任何文档,也不会跳转到索引中的另一个点,也不会反转索引。
    4. 您订购或执行范围查询的字段(您的>=必须在索引中最后。

    请注意,这可能不是它真正的工作方式,但该模型非常适合 - 事实上,我们建议在 Firebase 的其他数据库上实现多字段过滤,如下所述:Query based on multiple where clauses in Firebase

    【讨论】:

    • 我明白了,这是有道理的。谢谢你。现在我知道如何构建我的索引了。我希望这在文档中得到澄清。
    • 这是很好的反馈,每个文档页面的底部都应该有一个链接。我想记录这一点要困难得多,因为我们必须确保解释既准确又易于理解,在这里我可以以合理的准确性逃脱。 :)
    猜你喜欢
    • 2020-09-15
    • 2017-09-04
    • 2019-02-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多