gpt4 book ai didi

Flutter 中的 Firebase 复杂查询

转载 作者:IT王子 更新时间:2023-10-29 06:33:22 26 4
gpt4 key购买 nike

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

我曾尝试将多个 .where() 语句链接在一起,但这并没有产生我需要的效果,我在另一篇文章中读到多个 .orderBy() 语句会破坏查询,但为了检查另一个价格之类的字段输出告诉我我需要先 orderBy() 价格。可以应用任意数量的这些过滤器,也可以不应用任何过滤器,具体取决于设置。我在一个单独的函数中将底部的 lastVisible 变量用于 .startAfter 以获取更多产品。有什么方法可以生成我想用这种方式进行的查询吗?我还想知道是否可以做类似 .where('field', isEqualTo: x or y or z) 的事情。

    Query productQuery = Firestore.instance.collection('Products');

if(selectedCategories != null)
for(int i = 0; i < selectedCategories.length; i++)
productQuery = productQuery.where('category', isEqualTo: selectedCategories[i]);

if(minPrice > 0 && maxPrice > 0)
{
productQuery = productQuery.orderBy('price').where('price', isGreaterThanOrEqualTo: minPrice).where('price', isLessThanOrEqualTo: minPrice);
}
else if(minPrice > 0)
productQuery = productQuery.orderBy('price').where('price', isGreaterThanOrEqualTo: minPrice);

else if(maxPrice > 0)
productQuery = productQuery.orderBy('price').where('price', isLessThanOrEqualTo: maxPrice);

if(!showUnavailableItems)
productQuery = productQuery.where('status', isEqualTo: 'available');

switch(selectedCondition)
{
case 'Acceptable':
productQuery = productQuery
.where('condition', isEqualTo: 'Acceptable')
.where('condition', isEqualTo: 'Good')
.where('condition', isEqualTo: 'Very Good');
break;
case 'Good':
productQuery = productQuery
.where('condition', isEqualTo: 'Acceptable')
.where('condition', isEqualTo: 'Good');
break;
case 'Very Good':
productQuery = productQuery
.where('condition', isEqualTo: 'Acceptable');

break;
default:
break;
}

productQuery = productQuery.orderBy('id');

QuerySnapshot myQuery = await productQuery.getDocuments();
List<DocumentSnapshot> productSnaps = myQuery.documents;
print("INITIAL PRODUCT SNAPS LENGTH: ${myQuery.documents.length}");

if(productSnaps.length != 0)
lastVisible = productSnaps[productSnaps.length -1].data['id'];

应用条件或类别过滤器时,结果始终为 0 个文档。单独使用 minPrice 和 maxPrice 过滤器有效,但一起使用也会返回 0 个产品。除了在 Firebase 中创建索引的错误之外,我没有收到任何错误。

最佳答案

I was told that I need to apply these filters through the query in order to reduce the number of reads

这是正确的,因为在 Firestore 中,一切都与读取和写入的数量有关。

I have tried chaining together multiple .where() statements, but this does not produce the effect that I need

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

I read in another post that multiple .orderBy() statements will break the query

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

还请记住,如果您使用多个 orderBy() 方法调用,您会收到类似这样的警告:

Status{code=FAILED_PRECONDITION, description=The query requires an index.

所以不要忘记在您的 Firebase 控制台中创建一个索引。

Is there any way to product the kind of queries I want to make this way?

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

I would also like to know if it is possible to do something like .where('field', isEqualTo: x or y or z).

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

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

关于Flutter 中的 Firebase 复杂查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56386816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com