const animalsData = [];
let snapshot = null;
try {
if (!lastVisible) {
snapshot = await firestore()
.collection("animals")
.where("species", '==', selectedType)
.orderBy('timestamp', 'desc')
.limit(7)
.get();
} else {
snapshot = await firestore()
.collection("animals")
.where("species", '==', selectedType)
.orderBy('timestamp', 'desc')
.startAfter(lastDoc)
.limit(7)
.get();
}
当我添加
.where("species", '==', selectedType)
条件时,就会出现问题。初始查询工作正常并返回预期结果。但是,当尝试获取下一组数据(即实现分页)时,查询会返回一个空数组,即使有更多文档应该匹配条件。
一些额外的背景:
selectedType
是一个变量,用于保存我想要过滤的物种类型。
lastVisible
和 lastDoc
用于跟踪当前快照中的最后一个文档,以获取下一组数据。
我已确认
selectedType
变量已正确填充并且在查询中保持一致。
如果没有
.where
过滤器(即获取所有动物,无论物种如何),分页效果完美。
我不确定为什么添加
.where
过滤器会导致后续查询返回空数组。我已经进行了大量研究,但尚未找到解决此特定问题的解决方案。
任何有关如何解决此问题的见解或建议将不胜感激。谢谢!
对于要在 Firestore 上执行的每个查询,它需要有一个 index (或索引组合),可用于检查该查询中的条件。当您的查询仅对单个字段进行过滤/排序时,索引通常默认存在 - 因为 Firestore 自动创建单字段索引。但是,当您添加其他字段进行过滤/排序时,您通常需要一个 复合索引 - 并且您必须自己显式创建这些索引。
在大多数客户端上,当索引丢失时,SDK 会引发错误。如果您捕获并记录此错误,它会包含一个直接链接到 Firestore 控制台的 URL,您只需单击一下即可在其中创建索引(需要一些耐心)。有关详细信息,请参阅有关“通过错误消息创建缺失索引”的 Firestore 文档。或者,您可以在 Firebase 控制台中从头开始创建索引。