database - 在没有主键的情况下查询 Firestore

标签 database firebase google-cloud-firestore nosql

我希望我的用户能够更新 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/

相关文章:

firebase - 如何从 AlertDialog 小部件中的 firebase 读取数据?

ios - Firebase 获取重复数据

c# - 如何在软件安装期间生成数据库后端?

ios - Geofire查询距离的精度是多少?

Android-在Firebase数据库中编写节点内的Arraylist

java - Recyclerview 有条件点击

ios - 将 Firebase 通知与本地通知 iOS 结合使用

swift - 加载 Collection View 时节省内存

php - 如果 true 使用 foreach 循环,否则使用 while

sql - 在 "eventual"一致性和无事务(又名 SimpleDB)的情况下,你真的能走多远?