如何在Firestore中合并来自两个集合的数据?

时间:2019-06-15 12:30:14

标签: android firebase google-cloud-firestore

我在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)
        }
}

1 个答案:

答案 0 :(得分:2)

如果代码适合您的用例,那么这可能是适合您的方法。由于Firestore不支持服务器端联接,因此执行客户端联接是一种常见方法。

一些注意事项:

  1. 您正在使用get来获取项目和用户,这意味着您只能获取一次数据。没问题,但是我总是建议您仔细检查是否不应该listen for real time updates。没有什么更好的硬性规定,所以只需考虑对用户和代码库的优缺点。

  2. 请考虑您真正需要多少用户数据,以及在每个项目下复制所需的用户数据是否值得。如果复制数据,则无需执行嵌套的读取/客户端联接。实质上,您要存储更多的数据,并使写操作复杂化,以便获得更可扩展的读操作,并在那里获得更简单的代码。

刚接触NoSQL时,通常很难掌握新的数据模型。在这种情况下,我建议签出: