代码之家  ›  专栏  ›  技术社区  ›  Subhendu Kundu

如何修复onSnapshot中的未捕获错误:FirebaseError:查询需要索引。关于动态排序?

  •  0
  • Subhendu Kundu  · 技术社区  · 5 年前

    我在一个 desc

      const { id } = userDetails;
      const initialQuery = await firestore().collection('class')
        .orderBy('createdAt', 'desc')
        .where(`access.readAccess.${id}`, '==', true)
        .limit(5);
      initialQuery.onSnapshot((documentSnapshots) => {
        const { docs } = documentSnapshots;
        const lastVisible = docs.length > 0 ? docs[docs.length - 1] : '';
        console.log(docs);
      })
    
    const getMore = async(store, userDetails) => {
      const { id } = userDetails;
      const { lastVisible } = lastState;
      const initialQuery = await firestore().collection('class')
        .orderBy('createdAt', 'desc')
        .where(`access.readAccess.${id}`, '==', true).startAfter(lastVisible)
        .limit(5);
      const documentSnapshots = await initialQuery.get();
      const { docs } = documentSnapshots;
    }
    

    当我这样做时,我得到一个错误 The query requires an index 这看起来很公平,同时也有助于创建索引的url。当我创建索引时,它创建索引

    class
    access.readAccess.`1571158795762` Ascending createdAt Descending
    Collection
    Enabled
    

    1571158795762 将根据登录的用户不断更改。所以,当然,它开始抱怨另一个用户。也, onSnapshot 命令。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Doug Stevenson    5 年前

    云Firestore索引需要知道参与查询的所有特定字段。这就是它如何优化查询。如果其中一个查询字段是动态命名的,例如 access.readAccess.${id}

    解决这一问题的唯一方法是以与Firestore对索引的要求兼容的方式重新构造数据。因为我们不能很好地查看您要存储的数据,所以不可能给出一个有效的建议。但我要说的是,将ID移到一个列表中,并检查该列表中是否存在查询中的ID可能会有所帮助。