Как объединить данные из двух коллекций в FireStore? - PullRequest
0 голосов
/ 15 июня 2019

У меня есть две коллекции в Firestore db 1. проекты 2.Users

'projects' имеет поле 'selected_by', в котором хранится идентификатор пользователя, который его создал. Я хочу получить проекты вместе со всеми полями пользователя, который его создал.

Следующий код работает, но я не уверен, является ли это правильным способом и как мы узнаем, когда выборка пользовательских данных для каждого проекта завершена.

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 Ответ

2 голосов
/ 15 июня 2019

Если код работает для ваших сценариев использования, это, вероятно, правильный подход для вас.Поскольку Firestore не поддерживает присоединения на стороне сервера, такое объединение на стороне клиента является общепринятым подходом.

Хотя есть несколько соображений:

  1. Вы используетеget чтобы получить как проекты, так и пользователей, что означает, что вы получаете данные только один раз.С этим проблем нет, но я всегда рекомендую перепроверять, если вы не слушаете обновления в реальном времени.Там нет строгих правил, когда это лучше, так что просто подумайте, какие преимущества и недостатки могут быть для ваших пользователей и кодовой базы.

  2. Рассмотрите, сколько пользовательских данных вам действительно нужно, и является ли этоСтоит продублировать эти пользовательские данные, которые вам нужны под каждый проект.Если вы дублируете данные, вам не нужно выполнять вложенные операции чтения / соединения на стороне клиента.По сути, вы храните больше данных и усложняете свои операции записи, чтобы получить более масштабируемую операцию чтения и более простой код.

Когда вы новичок в NoSQL, его часто бывает трудно получить.чтобы справиться с новой моделью данных.В этом случае я рекомендую проверить:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...