从Firestore随机获取文档

时间:2020-01-08 17:13:13

标签: java android firebase google-cloud-firestore

我正在遵循this的方法来获取3个随机文档,这些文档存储在Firestore的集合中。

我正在使用第一种方法从8个随机类别中选择3个,这很好用。我的应用程序的下一步是用户单击3个类别之一,这样它应该从所选类别中获得3个随机问题,并将其显示在“类别选择”片段之后的片段中。我注意到我无法使用第一种方法,因为这最终将导致大量的阅读,因为最终,每个类别将至少包含500个问题。

显然,有一种更有效的方法来解决随机问题(第二种方法),但是我很难理解它。它说我应该创建另一个文档作为一个数组,该数组可以在其中容纳所有问题ID,但是如何将所有问题ID添加到该数组中?我不知道代码最终会是什么样子。

这是我存储问题的方式: enter image description here

当我正确理解第二种方法时,我必须将问题中的所有ID作为数组存储在文档中,但是如何将所有ID放入数组中?除了使用云功能之外,还有其他方法吗?因此,我需要的是上面链接中描述的第二种方法的代码实现或有关如何实现该方法的示例。

非常感谢您的帮助!

这是该方法的代码:

...
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 个答案:

答案 0 :(得分:2)

显然,有一种更有效的方法来解决随机问题(第二种方法)

实际上,我回答了这个问题,是的,这是正确的。第二种方法更有效。

它说我应该将另一个文档创建为可以在其中容纳所有问题ID的数组,但是如何将所有问题ID添加到该数组中?

有两种方法可以实现此目的。第一个是在创建问题数据库时在数组中添加问题的ID。这意味着,每次将新问题添加到数据库时,都将其对应的ID添加到该数组。这可以通过使用类似于以下代码的代码行来完成:

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

当我正确理解第二种方法时,我必须将问题中的所有ID作为数组存储在文档中,但是如何将所有ID放入数组中?

第二种方法,如果您已经将所有问题添加到数据库中,则应该遍历问题集合get all documents IDs并创建该数组。请注意另一件事,当您要添加另一个问题时,用所有ID填充阵列后,您应该再次使用解决方案一,以使集合中的问题与阵列保持同步。

除了使用云功能之外,还有其他方法吗?

如果愿意,您也可以使用Cloud Functions。我刚刚向您展示了如何在客户端上解决该问题。

相关问题