我试图从我的消防局数据库中查询一组5条记录。每次客户端成功地查询5条记录时,文档上的每个记录的视图字段都会增加1。我基本上希望数据库中的所有记录都能在客户端获得平等的机会,因此应该查询视图值最低的记录。但是,以下查询的行为并不像预期的那样,因为我一直在获取相同的记录集,尽管查询的记录现在具有更高的视图值。降序设置为false的orderBy不是将集合排序为先列出最低值吗?
QuerySnapshot snapshot = await FirebaseFirestore.instance
.collection('records')
.where('city', isEqualTo: city)
.where('views', isGreaterThan: -1)
.orderBy('views', descending: false)
.limit(5)
.get();
snapshot.docs.forEach((element) async {
Record record =
Record.fromMap(element.data() as Map<String, dynamic>);
await FirebaseFirestore.instance
.collection('records')
.doc(record.recordID)
.update({'views': FieldValue.increment(1)});
}
}

第一次查询后,文档id和查看日志:
e56a4c40-40e5-11ec-9a4b-b5164e53b334
F 219
Doc日志和视图第二个查询:
ecd328c0-40e6-11ec-a76a-cd0a98374153
F 237
发布于 2021-11-25 15:46:19
我不知道是什么解释了这种行为,但是如果在orderBy之后删除降序参数,它就能工作。我不知道为什么降序参数会引起问题。
如果不提供任何内容,则orderBy('views')默认为降序参数的false。
发布于 2021-11-25 22:43:56
看看orderBy在getBy函数中的https://www.npmjs.com/package/firebase-firestore-helper道具
你应该能够做这样的事情:
db.getBy({ where: [{ city }, ['views' '>', -1]], orderBy: ['views', 'desc'] });然后,在您的代码中,获得前5。
我不能百分之百地肯定这一点,但是limit在orderBy之前就会执行。
这是一个问题,因为,就我所记得的(我可能错了),Firebase将这样工作:
首先,获取所有的视图>-1 elements
命令,并检索它们。
再说一遍:我不能百分之百肯定这件事,但我记得我和你有同样的问题。
如果有人说我错了,我就删除这个答案。
看看这里的东西,https://firebase.google.com/docs/firestore/query-data/order-limit-data
免责声明:我是这个图书馆的创造者。它有助于在Firebase Firestore (并添加缓存)中操作对象。
https://stackoverflow.com/questions/70102043
复制相似问题