Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何实现Firestore+;中的OR子句的等价项;振作起来,保持我想要的秩序?_Firebase_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

Firebase 如何实现Firestore+;中的OR子句的等价项;振作起来,保持我想要的秩序?

Firebase 如何实现Firestore+;中的OR子句的等价项;振作起来,保持我想要的秩序?,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我有一个flatter应用程序,它成功地显示了集合中文档的列表视图。但现在我需要一些过滤器 我知道Firestore中并没有OR子句(尽管我认为应该有),所以我读到,根据需要的OR条件的值的多少,我可以通过两个或多个查询获得类似的结果 好的,我理解逻辑,但我拒绝相信这是一个最佳的解决方案。尽管如此,我决定在我的应用程序中实现该解决方案,但仍然无法取得成功 想象一个场景:我有一个“雇员”文档集合。很多有4种类型的员工: [Production, Administrative, Security,

我有一个flatter应用程序,它成功地显示了集合中文档的列表视图。但现在我需要一些过滤器

我知道Firestore中并没有OR子句(尽管我认为应该有),所以我读到,根据需要的OR条件的值的多少,我可以通过两个或多个查询获得类似的结果

好的,我理解逻辑,但我拒绝相信这是一个最佳的解决方案。尽管如此,我决定在我的应用程序中实现该解决方案,但仍然无法取得成功

想象一个场景:我有一个“雇员”文档集合。很多有4种类型的员工:

[Production, Administrative, Security, External]
我的应用程序假装允许根据员工类型进行筛选。因此,如果在某一时刻我只想要生产和管理类型,我必须:

 Query q1 = collectionReference.where('type', isEqualTo: 'Production').orderBy('name');
 Query q2 = collectionReference.where('type', isEqualTo: 'Administrative').orderBy('name');
 QuerySnapshot querySnapshot1 = await q1.getDocuments();
 QuerySnapshot querySnapshot2 = await q2.getDocuments();

…那么我如何才能将两个查询合并为一个呢

而且,由于数据库中有数千名员工,我使用
limit(20)
startAfter(Document)
子句对他们进行分页。理想的情况是快照为我提供了正确数量的文档、正确的条件和正确的顺序(名称)


附录:在Java中,您可以尝试下面的方法,但Dart呢

Task task1 = employees.whereLessThan("type", "Production") .orderBy("name") .get(); 
Task task2 = employees.whereGreaterThan("type", "Production") .orderBy("name") .get(); 
Task<List<QuerySnapshot>> allTasks = Tasks.whenAllSuccess(task1, task2); 
allTasks.addOnSuccessListener(new OnSuccessListener<List<QuerySnapshot>>() { 
   @Override 
   public void onSuccess(List<QuerySnapshot> querySnapshots) {
      ... 
   } 
}
task1=employees.whereLessThan(“类型”、“生产”).orderBy(“名称”).get();
任务task2=员工。其中大于(“类型”、“生产”).orderBy(“名称”).get();
Task allTasks=Tasks.whenAllSuccess(task1,task2);
allTasks.addOnSuccessListener(新OnSuccessListener(){
@凌驾
成功时公共无效(列出查询快照){
... 
} 
}

我认为您的问题是承认in查询迫使您陷入这种情况,这是不可取的,但绝对必要的。您唯一的求助方式(不使用其他数据库)现在是使用您的解决方案,并向Firebase支持部门提交一个功能请求。感谢Doug的快速响应,但我的解决方案尚未成功。因此您遇到了以下问题:1)执行N个查询,2)等待每个查询完成,3)将结果收集到单个列表中,4)根据需要在应用程序中对整个列表进行排序?是的,问题在3和4中。请编辑您的问题,以包含最小的代码,以复制您尝试合并查询结果的代码。正如您可能已经注意到的那样,在评论中发布重要代码是非常不可读的。我认为您的问题是承认in查询迫使您进入这种情况,这是不可取的,但绝对是必需的。目前,您唯一的办法(不使用其他数据库)是使用您的变通方法,并向Firebase支持部门提交功能请求。谢谢Doug的快速回复,但我的解决方案还没有成功,tho。所以你很难1)执行N个查询,2)等待每个查询完成,3)将结果收集到单个列表中,4)根据需要在应用程序中对整个列表进行排序?是的,问题在3和4中。请编辑您的问题,使其包含最小的代码,以复制您尝试合并查询结果的代码。正如您可能已经注意到的那样,在注释中发布重要代码是非常不可读的。