我有以下格式的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
,您捕获用户的标记是否通过,然后执行相等性检查(==
)。不太可能的范围操作,可以对不同字段进行相等性检查。