我在Firestore数据库中有两个集合 1.项目 2.用户
“项目”具有一个字段“ created_by”,其中包含创建它的用户的ID。我想提取项目以及创建它的用户的所有字段。
以下代码可以工作,但是我不确定这是否是正确的方法,以及如何知道每个项目的用户数据获取何时完成。
fun getProjects(){
val works = arrayListOf<Work>()
db.collection("projects")
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
val work = Work(document.id,
document.data.get("title").toString(),
document.data.get("skills") as ArrayList<String>,
document.data.get("date_created") as Date)
works.add(work)
db.collection("users").document(document.data.get("created_by").toString()).get()
.addOnSuccessListener {
documentSnapshot ->
work.created_by = User(documentSnapshot.data?.get("name").toString(),
documentSnapshot.data?.get("mob").toString(),
documentSnapshot.data?.get("role").toString(),
documentSnapshot.data?.get("rating").toString(),
documentSnapshot.data?.get("skills") as ArrayList<String>
)
Log.d("works", works.toString())
}
}
}
.addOnFailureListener { exception ->
Log.w(TAG, "Error getting documents: ", exception)
}
}
答案 0 :(得分:2)
如果代码适合您的用例,那么这可能是适合您的方法。由于Firestore不支持服务器端联接,因此执行客户端联接是一种常见方法。
一些注意事项:
您正在使用get
来获取项目和用户,这意味着您只能获取一次数据。没问题,但是我总是建议您仔细检查是否不应该listen for real time updates。没有什么更好的硬性规定,所以只需考虑对用户和代码库的优缺点。
请考虑您真正需要多少用户数据,以及在每个项目下复制所需的用户数据是否值得。如果复制数据,则无需执行嵌套的读取/客户端联接。实质上,您要存储更多的数据,并使写操作复杂化,以便获得更可扩展的读操作,并在那里获得更简单的代码。
刚接触NoSQL时,通常很难掌握新的数据模型。在这种情况下,我建议签出: