我希望我的用户能够更新 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 次读取吗?如果是,正确的方法是什么?
最佳答案
如 StackOverflow 上的此回答所述:https://stackoverflow.com/a/49725001/7846567 ,只有查询返回的文档才算作读取操作。
现在针对您的特殊情况:
doc.where("slug", "==", "beautiful-slug").limit(1).get();
这确实会导致在Firestore服务器上进行大量读取操作,直到找到正确的文档。但是通过使用 limit(1)
,您将只会收到一个文档,这样一来,只有一个读取操作会被计入您的限制。
使用 where()
函数是解决您的问题的正确且推荐的方法。
关于database - 在没有主键的情况下查询 Firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61907878/