如何从 - Firestore 复杂查询生成结果,其中包含多个 .where 选项以及'='或'!='?



我有以下格式的Firestore数据;

Collection: 'DataList'
Document : Autogenerated
Collection:
UserId : 3793
PassMarks: 40
Duration: 60
ObtainedMarks: 45
UserId : 3794
PassMarks: 40
Duration: 60
ObtainedMarks: 35
UserId : 3795
PassMarks: 40
Duration: 60
ObtainedMarks: 70

(类似的多个项目在一个列表中)

Working query =FirebaseFirestore.instance.collection('DataList').where('UserId', is NotEqualTo: 3793).snapshots();

我想用下面的选项排序/筛选列表;

FirebaseFirestore.instance.collection('DataList')
.where('UserId', is NotEqualTo: 3793)
.where('ObtainedMarks', isGreatedThanOrEqualTo: 'PassMarks)
.orderBy('ObtainedMarks', decending: true)
.snapshots();

()这个查询会产生错误,只是为了更好地理解我在寻找什么。)

我知道复杂的查询可以只引用相同的字段,如果有'='或'!='被使用,我们不能与其他查询合并。

有没有人能告诉我在Flutter中获得上述结果的替代方法?

当我使用上面的$导致一个ListView生成器,所以我需要在上面(.snapshot()),但不是在(.map())简单易用。

我想你遇到的问题是你试图在UserId上做一个不等于a>=onObtainedMarks。这是不可能的,正如文档所解释的:

在复合查询中,range (<,<=,>,>=)和not equals (!=,not-in)的比较必须在同一字段上进行过滤。

你的选择是:

  • 从查询中删除UserId中的过滤器,并从应用程序代码的结果中跳过用户文档。您将在这里阅读太多文档,但考虑到您只跳过一个用户,它可能不会有很多额外的文档。
  • 添加一个字段hasPassingMarks,您捕获用户的标记是否通过,然后执行相等性检查(==)。不太可能的范围操作,可以对不同字段进行相等性检查。

最新更新