【问题标题】:Flutter Firestore startAt() endtAt() not working when orderby string values当 orderby 字符串值时 Flutter Firestore startAt() endtAt() 不起作用
【发布时间】:2019-06-15 11:35:03
【问题描述】:

我在按标题排序时尝试使用 startAt([1]) 和 endAt([3]) 但它不起作用。

QuerySnapshot snapshot = await Firestore.instance.collection('items')
  .orderBy("title", descending: false).startAt([1]).endAt([2]).limit(2).getDocuments();

当我按等级 startAt([1]) 和 endAt([3]) 尝试时,它可以工作。

QuerySnapshot snapshot5 = await Firestore.instance.collection('items')
  .orderBy("rank", descending: false).startAt([1]).endAt([2]).limit(2).getDocuments();

当我不使用 endAt() 时工作​​

为什么我按标题订购时它不起作用?

QuerySnapshot snapshot = await Firestore.instance.collection('items')
  .orderBy("title", descending: false).startAt([1]).limit(2).getDocuments();

有人知道吗?

我尝试过的: 1. 确保软件包是最新的 2. 在firestore上创建索引

[这不起作用] QuerySnapshot 快照 = await Firestore.instance.collection('items').orderBy("title", descending: false).startAt([1]).endAt([2]).limit(2).getDocuments();

[THIS WORKS]
QuerySnapshot snapshot5 = await Firestore.instance.collection('items')
  .orderBy("rank", descending: false).startAt([1]).endAt([2]).limit(2).getDocuments();

[THIS WORKS]
QuerySnapshot snapshot = await Firestore.instance.collection('items')
  .orderBy("title", descending: false).startAt([1]).limit(2).getDocuments();

我期望在过滤时能够使用 endAt() 但它会抛出错误

【问题讨论】:

    标签: dart flutter google-cloud-firestore


    【解决方案1】:

    我将假设您的 rank 字段是数字,而您的 title 字段是字符串。在这种情况下,这是预期行为。

    Firestore 查询按 而不是偏移量过滤。所以当你:

    .orderBy("rank", descending: false).startAt(1).endAt(2)
    

    文档按等级排序,然后返回等级在 1 到 2(含)之间的文档。

    当你这样做时:

    .orderBy("title", descending: false).startAt(1).endAt(2)
    

    文档按标题排序,然后返回标题在 1 到 2 之间的文档。但是由于标题是字符串而不是数字,这意味着没有文档符合条件并且没有返回任何内容。

    Firestore 没有偏移查询的概念,您可以在其中告诉它跳过第一个 n 结果。

    【讨论】:

    • 感谢您的信息。我试图用这个进行分页。看起来我对上面的代码一无所知,因为它不是这样工作的。知道我应该如何进行分页吗?
    • 由于 Firebase 上的查询不适用于偏移量,因此您必须跟踪相关字段和您显示的最后一项的键。搜索以前的questions about pagination on Firestorepagination on Firebase 以获取更多尝试过的人。另请注意,有一个paging adapter for Firestore in FirebaseUI
    • BTW 它需要像List<Object?> 这样的参数。 Query<Map<String, dynamic>> startAt(List<Object?> values) package:cloud_firestore/cloud_firestore.dart 获取 [values] 列表,创建并返回一个新的 [Query],该 [Query] 从提供的字段开始,相对于查询的顺序。 [values] 必须按 [orderBy] 过滤器的顺序排列。调用此方法将替换任何现有的游标“开始”查询修饰符。
    猜你喜欢
    • 2021-07-07
    • 2020-12-25
    • 2018-12-28
    • 1970-01-01
    • 2021-09-14
    • 2018-10-22
    相关资源
    最近更新 更多