【问题标题】:Querying Firestore without Primary Key查询没有主键的 Firestore
【发布时间】:2020-09-06 12:16:26
【问题描述】:

我希望我的用户能够更新 URL 上的 slug,如下所示:

url.co/username/projectname

我可以使用主键,但不幸的是 Firestore 不允许在设置后对分配的 uid 进行任何修改,因此我创建了一个唯一的 slug 字段。

结构示例:

projects: {
    P10syfRWpT32fsceMKEm6X332Yt2: {
        slug: "majestic-slug",
        ...
    },
    K41syfeMKEmpT72fcseMlEm6X337: {
        slug: "beautiful-slug",
        ...
    },
}

修改 slug 的一种方法是删除并复制新文档上的数据,这样做会变得复杂,因为我在文档中附加了子集合。

我知道我可以像这样通过文档键查询:

var doc = db.collection("projects");
var query = doc.where("slug", "==", "beautiful-slug").limit(1).get();

问题来了。

如果我的数据库中有超过 1000 个文档,这不是非常不切实际吗,每次我都必须调用一个项目 (url.co/username/projectname) 不会因为它必须查询而花费 +1000 次读取通过所有文件?如果是,正确的方法是什么?

【问题讨论】:

    标签: database firebase google-cloud-firestore nosql


    【解决方案1】:

    正如 StackOverflow 上的这个答案所述:https://stackoverflow.com/a/49725001/7846567,只有查询返回的文档才算作读取操作。

    现在针对您的特殊情况:

    doc.where("slug", "==", "beautiful-slug").limit(1).get();
    

    这确实会导致 Firestore 服务器上的大量读取操作,直到找到正确的文档。但是通过使用limit(1),您只会收到一个文档,这样只有一个读取操作会被计入您的限制。

    使用where() 函数是解决问题的正确方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2018-04-11
      • 2015-02-20
      • 1970-01-01
      • 2022-10-06
      • 2019-06-23
      相关资源
      最近更新 更多