【问题标题】:flutter firestore query index not working颤动的Firestore查询索引不起作用
【发布时间】:2020-12-19 11:56:33
【问题描述】:

我正在使用 Flutter 和 firebase firestore,目前正在处理一项功能。从文档中,我需要创建一个索引以使我的功能正常工作,但它实际上不起作用。

我的功能:

getList(String category, ProviderNotifier providerNotifier) async {
List<Data> _myList = [];

DateTime _now = DateTime.now();
DateTime _start = DateTime(_now.year, _now.month-1, 1, 0, 0);

  QuerySnapshot snapshot = await db
  .collection('data')
  .where('category', isEqualTo: category)
  .where('dateWhenProofed', isGreaterThanOrEqualTo: _start)
  .orderBy('likes', descending: true)
  .limit(3)
  .get();

  snapshot.docs.forEach((document) {
    Data data = Data.fromJson(document.data());
    _myList.add(data);
  });

  providerNotifier.myList = _myList;
}

我做了两个索引,一个有赞,一个没有赞。 如果我在我的查询中删除 orderBy likes,它工作得非常好。我不明白。

【问题讨论】:

  • 你有什么错误吗?
  • firebase 会返回给您什么?你打印了吗?
  • 如果我通过喜欢路径离开订单,它说我必须创建一个带有链接的索引,它会自动为我创建它。如果我通过 Likes 行添加订单,我不会从控制台获得任何信息,没有错误

标签: firebase flutter google-cloud-firestore


【解决方案1】:

您的查询产生了错误。我建议花时间查找并阅读该错误,因为它会告诉您哪里出了问题。

Firestore 不允许您主要对除您在范围过滤器中使用的字段之外的字段进行排序。您的范围过滤器位于“dateWhenProofed”上,因此您必须先按该字段排序。

我建议查看documentation on the limitations for ordering data

如果您包含具有范围比较(、>=)的过滤器,则您的第一个排序必须在同一字段中。

【讨论】:

  • 您好,Doug,感谢您的回答和文档参考。我终于能够通过添加 .catchError((error) => print("---- Failed to: $error")); 来读取错误。我还没有为我的过滤器找到可行的解决方案。你知道如何过滤:“时间范围”的时间范围内按“喜欢”排序的“数据”类型的所有数据匹配过滤器“类别”?
  • 查询完成后,您可以在客户端应用上对查询结果重新排序。
  • 你的意思是这样吗? (快照结果):snapshot.docs.sort((a, b) => a['likes'].compareTo(b['likes']));
  • 没问题,随便你。
  • 非常感谢您的方法。表现如何?你有这方面的经验吗?
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 2019-07-18
  • 2017-10-05
  • 1970-01-01
  • 2018-12-28
  • 2020-04-11
  • 2020-07-27
  • 2018-08-12
相关资源
最近更新 更多