Случайно получить документы из Firestore - PullRequest
0 голосов
/ 08 января 2020

Я следую этому подходу, чтобы получить 3 случайных документа, которые хранятся в коллекции в Firestore.

Я использую первый подход, чтобы выбрать 3 случайные категории из 8, что работает нормально. Следующим шагом в моем приложении является то, что пользователь нажимает на одну из 3 категорий, и поэтому он должен получить 3 случайных вопроса из выбранной категории и отобразить их во фрагментах, следующих за фрагментом «Выбор категории». Я заметил, что не могу использовать первый подход, так как это приведет к огромному количеству прочтений, поскольку, в конце концов, у каждой категории будет не менее 500 вопросов.

Очевидно, есть более эффективный способ получить случайные вопросы (второй подход), но мне трудно понять это. В нем говорится, что я должен создать другой документ в виде массива, который может содержать все идентификаторы вопросов, но как мне добавить все идентификаторы вопросов в этот массив? Я не знаю, как в итоге будет выглядеть код.

Вот как я хранил свои вопросы: enter image description here

Когда я правильно понял второй подход Я должен хранить все идентификаторы из вопросов в документе в виде массива, но как мне получить все идентификаторы в массиве? Есть ли другой подход, кроме использования облачных функций? Поэтому мне нужна реализация кода второго подхода, описанного в приведенной выше ссылке, или пример того, как реализовать этот подход.

Любая помощь очень ценится!

Вот код Я за подход:

...
questionRef.document(tvCat1).collection(tvCat1).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {

                            List<Questions> questionsList = new ArrayList<>();
                            for (DocumentSnapshot document : task.getResult()) {
                                Questions question = document.toObject(Questions.class);
                                questionsList.add(question);
                            }

                            int questionListSize = questionsList.size();
                            List<Questions> randomQuestionsList = new ArrayList<>();
                            for (int i = 0; i < questionListSize; i++) {
                                Questions randomQuestions = questionsList.get(new Random().nextInt(questionListSize));
                                if (!randomQuestionsList.contains(randomQuestions)) {
                                    randomQuestionsList.add(randomQuestions);
                                    if (randomQuestionsList.size() == 3) {

                                        Collections.shuffle(questionsList);

                                        question1 = questionsList.get(0).getQuestion();
                                        question2 = questionsList.get(1).getQuestion();
                                        question3 = questionsList.get(2).getQuestion();

                                        answer1 = questionsList.get(0).getAnswer();
                                        answer2 = questionsList.get(1).getAnswer();
                                        answer3 = questionsList.get(2).getAnswer();
...

1 Ответ

2 голосов
/ 08 января 2020

Очевидно, есть более эффективный способ получить случайные вопросы (второй подход)

На самом деле, я ответил на этот вопрос, и да, это правильно. Второй подход более эффективен.

Он говорит, что я должен создать другой документ в виде массива, который может содержать все идентификаторы вопросов, но как мне добавить все идентификаторы вопросов в этот массив?

Есть два способа достичь этого. Первым из них будет добавление идентификатора вопроса в массив при создании базы данных вопросов. Это означает, что каждый раз, когда вы добавляете новый вопрос в базу данных, добавляйте соответствующий идентификатор в этот массив. Это можно сделать с помощью строки кода, которая должна выглядеть примерно так:

documentRef.update("questions", FieldValue.arrayUnion("newQuestionId"));

Когда я правильно понял второй подход, я должен сохранить все идентификаторы из вопросов в документе как массив, но как я могу получить все идентификаторы в массиве?

Второй подход, если вы уже добавили все вопросы в базу данных, то вам нужно перебрать коллекцию вопросов, получить все идентификаторы документов и создать этот массив. Обратите внимание также на еще одну вещь: после заполнения массива всеми идентификаторами, когда вы хотите добавить еще один вопрос, вы должны снова использовать решение одно, чтобы держать вопросы из коллекции в синхронизации c с вашим массивом.

Есть ли другой подход, кроме использования облачных функций?

Вы также можете использовать облачные функции, если хотите. Я только что показал вам, как вы можете решить это на клиенте.

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