参见英文答案 > Firestore: How to get random documents in a collection 5个
我在Cloud Firestore的单个集合中有1000个文档,是否可以获取随机文档?
比如说:学生是Firestore的一个系列,我在该系列中有1000名学生,我的要求是在每次通话时随机挑选10名学生.
解决方法:
是的,为了达到这个目的,请使用以下代码:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();CollectionReference studentsCollectionReference = rootRef.collection("students");studentsCollectionReference.get().addOnCompleteListener(new OnCompleteListener<querySnapshot>() { @OverrIDe public voID onComplete(@NonNull Task<querySnapshot> task) { if (task.isSuccessful()) { List<Students> studentList = new ArrayList<>(); for (documentSnapshot document : task.getResult()) { Student student = document.toObject(Student.class); studentList.add(student); } int studentCount = studentList.size(); int randomNumber = new Random().nextInt(studentCount); List<Students> randomStudentList = new ArrayList<>(); for(int i = 1; i < 10; i++) { randomStudentList.add(studentList.get(randomNumber)); } } else { Log.d(TAG, "Error getting documents: ", task.getException()); } }});
这被称为经典解决方案,您可以将它用于仅包含少量记录的集合,但如果您害怕获得大量读取,我会建议您使用第二种方法.这还需要通过添加一个可以在数组中保存所有学生ID的新文档来对数据库进行一些更改.因此,要获得10名学生,您只需要进行一次单独的get()调用,这意味着只需要一次读取 *** 作,并获得包含学生ID的文档以及另外10次读取以获得实际的随机学生.
这种做法称为非规范化(复制数据),是Firebase的常见做法.如果您是Nosql数据库的新手,为了更好地理解,我建议您看一下这个视频,Denormalization is normal with the Firebase Database.它适用于Firebase实时数据库,但同样的原则适用于Cloud Firestore.
但是记住,就像你在这个新创建的节点中添加随机产品一样,你需要在不再需要的时候删除它们.
要将学生ID添加到数组,只需使用:
FIEldValue.arrayUnion("yourArrayProperty")
要删除学生ID,请使用:
FIEldValue.arrayRemove("yourArrayProperty")
要一次获得所有10名随机学生,您可以使用List< Task< documentSnapshot>>然后调用Tasks.whenAllSuccess(tasks),如我在这篇文章中的回答中所述:
> Android Firestore convert array of document references to List<Pojo>
总结以上是内存溢出为你收集整理的java – 从Firestore中选择随机文档[复制]全部内容,希望文章能够帮你解决java – 从Firestore中选择随机文档[复制]所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)