flatter中的Firebase复杂查询

flatter中的Firebase复杂查询,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我正在Firebase的一个集合中工作,该集合存储有关产品的信息。以前,我只是获取所有产品,然后在客户端对它们应用过滤器。有人告诉我,我需要在查询中应用这些过滤器,以减少Firebase需要的读取次数,因为将有大量的产品 我曾尝试将多个.where()语句链接在一起,但这并没有产生我需要的效果,我在另一篇文章中读到,多个.orderBy()语句将中断查询,但为了检查其他字段(如price),输出告诉我需要先执行orderBy()price。根据设置,可以应用任意数量的过滤器,也可以不应用任何过滤

我正在Firebase的一个集合中工作,该集合存储有关产品的信息。以前,我只是获取所有产品,然后在客户端对它们应用过滤器。有人告诉我,我需要在查询中应用这些过滤器,以减少Firebase需要的读取次数,因为将有大量的产品

我曾尝试将多个.where()语句链接在一起,但这并没有产生我需要的效果,我在另一篇文章中读到,多个.orderBy()语句将中断查询,但为了检查其他字段(如price),输出告诉我需要先执行orderBy()price。根据设置,可以应用任意数量的过滤器,也可以不应用任何过滤器。我在一个单独的函数中使用.startAfter底部的lastVisible变量来获取更多产品。有什么方法可以产生我想用这种方法进行的查询吗?我还想知道是否有可能像这样做。where('field',isEqualTo:x或y或z)

queryproductquery=Firestore.instance.collection('Products');
如果(selectedCategories!=null)
对于(int i=0;i0&&maxPrice>0)
{
productQuery=productQuery.orderBy('price')。其中('price',大于或等于QUALTO:minPrice)。其中('price',小于或等于QUALTO:minPrice);
}
否则如果(最小价格>0)
productQuery=productQuery.orderBy('price')。其中('price',大于或等于OreQualto:minPrice);
否则如果(最大价格>0)
productQuery=productQuery.orderBy('price')。其中('price',isLessThanOrEqualTo:maxPrice);
如果(!showUnavailableItems)
productQuery=productQuery.where('status',isEqualTo:'available');
开关(选择的条件)
{
“可接受”案例:
productQuery=productQuery
.其中('条件',isEqualTo:'可接受')
.where('condition',isEqualTo:'Good')
.where('条件',isEqualTo:'非常好');
打破
案例“好”:
productQuery=productQuery
.其中('条件',isEqualTo:'可接受')
.where('condition',isEqualTo:'Good');
打破
案例“非常好”:
productQuery=productQuery
.其中('条件',isEqualTo:'可接受');
打破
违约:
打破
}
productQuery=productQuery.orderBy('id');
QuerySnapshot myQuery=等待productQuery.getDocuments();
List productsnap=myQuery.documents;
打印(“初始产品快照长度:${myQuery.documents.LENGTH}”);
如果(productSnaps.length!=0)
lastVisible=productSnaps[productSnaps.length-1]。数据['id'];
应用条件或类别筛选器时,结果始终为0个文档。分别使用minPrice和maxPrice过滤器可以工作,但同时返回0个产品。除了在Firebase中创建索引的错误之外,我没有收到任何错误

我被告知需要在查询中应用这些过滤器,以减少读取次数

这是正确的,因为Firestore中的一切都与读写次数有关

我尝试将多个.where()语句链接在一起,但这并没有产生我需要的效果

你为什么这么说?我已经多次使用
where()
函数来过滤Cloud Firestore数据库中的数据,从未失败过

我在另一篇文章中读到,多个.orderBy()语句将中断查询

不是真的!请检查我在以下帖子中的答案:

还请记住,如果您使用多个
orderBy()
方法调用,则会收到类似于以下内容的警告:

状态{code=FAILED\u前提条件,description=查询需要索引

所以别忘了在Firebase控制台中创建索引

有什么方法可以产生我想用这种方法进行的查询吗

是的,您可以使用您已经提到的所有选项

我还想知道是否有可能像这样做。where('field',isEqualTo:x或y或z)

不,这是不可能的,但有一种解决方法可以帮助您实现同样的目标。关于这一点,请参阅我在以下帖子中的答案:


因此,不要使用数组,而是使用映射并链接多个
where()
调用。

谢谢您的回答。我所说的多个
.where()是什么意思
语句是当条件的switch语句为
非常好
时,查询返回所有
非常好
的产品作为
条件
,但当选择
时,我希望它返回所有将
条件
设置为
非常好
好的产品
,但当该案例运行时,它始终返回0个没有错误代码的产品。当您希望将条件设置为
非常好
,这意味着您正在查找or子句(SQL术语),这在Cloud Firestore中目前不受支持。有关解决方案,请参阅我的答案。我能够修改我的Firebase文档的数据结构,不需要任何或基于逻辑的查询。感谢您在上一篇文章中链接到Firebase限制。哇,甚至不支持或?我想知道为什么有这么多人我们仍然在使用Firebase,但它在这种常见情况下甚至不起作用。我能说Firebase查询非常弱吗?@Bagusflyer这个答案是从2019年开始的。现在,到2020年,我们可以选择使用;)