我只想显示10个文档,这些文档按数字OfLikes降序排列,并且是在过go 24小时内创建的.但是每当我使用where()和orderBy()时,逻辑就失败了.运行下面的代码后,我添加了所需的Firebase索引,但文档是按最近发布的而不是最受欢迎的进行排序的.这样不可能吗?如果是这样的话,我怎么才能做到这一点呢?注:number OfLikes是FireStore数据库中的一个数字.如果有任何帮助,我将不胜感激.谢谢.

StreamBuilder(
              stream: FirebaseFirestore.instance
                  .collection('posts')
                  .where("datePublished",
                      isGreaterThan:
                          DateTime.now().subtract(const Duration(hours: 24)))
                  .orderBy("datePublished", descending: true)
                  .orderBy("numberOfLikes", descending: true)
                  .limit(10)
                  .snapshots(),
              builder: (context,
                  AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>> snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return Center(child: CircularProgressIndicator());
                }
                if (snapshot.hasError) {
                  print(snapshot.error);
                  return Text("No Posts Found");
                }
                return Container(
                  height: MediaQuery.of(context).size.height * .37,
                  width: MediaQuery.of(context).size.width * .98,
                  child: ListView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: snapshot.data!.docs.length,
                    itemBuilder: (context, index) => TrendingPostsCard(
                      snap: snapshot.data!.docs[index].data(),
                    ),
                  ),
                );
              },
            ),
             

推荐答案

由于您总是需要对要执行关系条件(即>=)的字段进行排序,因此您无法在某个范围内获得排名前X的帖子.

你可以:

  • 获取日期范围内的所有帖子,然后对应用程序代码中的前10条进行排序/筛选.
  • 或者获取所有日期的前N个帖子,然后按日期范围进行筛选.这里的问题是,N不是一个已知值.

这一限制是FiRestore(和许多NoSQL数据库)工作方式所固有的,因为它们对整个查询使用单个索引-而且只有一个>类型的操作是可能的.有关这方面的更多信息,也请参见托德关于Getting to know Cloud Firestore,特别是How do queries work in Cloud Firestore?的出色视频.你可能还会从我自己关于implementing geoqueries on Firebase and Firestore的演讲中了解到这种错综复杂的情况.

如果希望能够执行查询中的两个条件,则需要确保其中一个部分具有相等条件.例如,如果您保存了一个 map ,其中包含每个帖子的日期,则可以执行相等查询来获取今天的帖子,然后对最受欢迎的帖子使用orderBy/limit组合.

Flutter相关问答推荐

Android NFC未收到空的NFC标签

如何组合匹配器

使用Future函数的容器中未显示图像,但在使用图像小工具时显示

BlocBuilder仅生成一次,并在后续发出时停止重建

怎么才能像这样在摆动着这些曲线呢?

参数类型';List<;Dynamic&>不能分配给参数类型';List<;SingleChildWidget&>';

使索引[0]在ListViewBuilder中返回字符串1

如何在Flutter中制作弯曲文本

Flutter飞溅屏幕即使在修改后仍显示默认徽标和背景色

无法在 Flutter 项目中安装最新版本的 image_picker

Flutter:注册 UI 出现 UI 问题(将注册框提升到顶部并向电话号码 pin 码添加一个框)

如何设置行中项目之间的空格相等?

我的第一个 flutter 项目出错,启动时为空值?

访问 AsyncSnapshot 中的嵌套属性

flutter 创建一个带有 2 个图标的按钮

Show Snackbar above to showModalBottomSheet Flutter

在 CircleAvatar 中放置芯片

Getx Flutter 在更新值时抛出空错误

Flutter - 检测手指何时进入容器

如何从dart 中的当前日期时间中减go 1 天?