Flutter Firestore数据库在过去24小时内订购最喜欢的文档



我只想显示过去24小时内创建的10个文档,这些文档按点赞次数降序排列。但是每当我使用where((和orderBy((时,逻辑都会失败。运行完下面的代码后,我添加了所需的索引Firebase,但文档是按最近发布的文档排序的,而不是按最喜欢的文档排序。这样做不可能吗?如果是的话,我还能怎么做到呢?注:numberOfLikes是消防仓库数据库中的一个数字。如果有任何帮助,我将不胜感激。非常感谢。

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数据库(工作方式固有的,因为它们对整个查询使用单个索引,并且只能执行一个>类型的操作。有关更多信息,请参阅Todd关于了解Cloud Firestore的精彩视频,特别是查询如何在Cloud Firestore中工作?您还可以从我自己关于在Firebase和Firestore上实现地理查询的演讲中了解到这些复杂性。

如果希望能够在查询中执行这两个条件,则需要确保其中一个部分具有相等条件。例如,如果您保留了一张包含每条帖子日期的地图,则可以执行相等查询以获得今天的帖子,然后使用orderBy/limit组合来获得最喜欢的帖子。

最新更新