当我在react native firestore中使用where时,startAfter返回一个空数组

问题描述 投票:0回答:1
 
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
过滤器会导致后续查询返回空数组。我已经进行了大量研究,但尚未找到解决此特定问题的解决方案。

任何有关如何解决此问题的见解或建议将不胜感激。谢谢!

javascript firebase google-cloud-firestore react-native-firebase
1个回答
0
投票

对于要在 Firestore 上执行的每个查询,它需要有一个 index (或索引组合),可用于检查该查询中的条件。当您的查询仅对单个字段进行过滤/排序时,索引通常默认存在 - 因为 Firestore 自动创建单字段索引。但是,当您添加其他字段进行过滤/排序时,您通常需要一个 复合索引 - 并且您必须自己显式创建这些索引。

在大多数客户端上,当索引丢失时,SDK 会引发错误。如果您捕获并记录此错误,它会包含一个直接链接到 Firestore 控制台的 URL,您只需单击一下即可在其中创建索引(需要一些耐心)。有关详细信息,请参阅有关“通过错误消息创建缺失索引”的 Firestore 文档。或者,您可以在 Firebase 控制台中从头开始创建索引。

© www.soinside.com 2019 - 2024. All rights reserved.