Javascript 如何修复onSnapshot:FirebaseError中的未捕获错误:查询需要索引。关于动态排序?
我有一个查询,按照Javascript 如何修复onSnapshot:FirebaseError中的未捕获错误:查询需要索引。关于动态排序?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我有一个查询,按照desc顺序查询,使用如下方法 const { id } = userDetails; const initialQuery = await firestore().collection('class') .orderBy('createdAt', 'desc') .where(`access.readAccess.${id}`, '==', true) .limit(5); initialQuery.onSnapshot((document
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);
})
当我这样做时,我得到了一个错误,查询需要一个索引,这似乎是公平的,也是创建索引的有用url。当我创建索引时,它会创建
class
access.readAccess.`1571158795762` Ascending createdAt Descending
Collection
Enabled
现在,此1571158795762
将根据登录的用户不断更改。所以,当然,它开始抱怨另一个用户。而且,onSnapshot
不会使用desc
order调用。
有什么建议吗 云Firestore索引需要知道参与查询的所有特定字段。这就是它如何优化查询的方法。如果其中一个查询字段是动态命名的,例如access.readAccess.${id}
,则这种查询不适合Firestore
解决这一问题的唯一方法是以符合Firestore对索引要求的方式重新构造数据。由于我们无法很好地了解您试图存储的数据,因此不可能给出有效的建议。但是我要说的是,将ID移动到一个列表中,并检查该列表中是否存在查询中的ID可能会有所帮助。是的,我在发布问题后立即发布了这个消息。谢谢你的确认。以防有人遇到类似的问题,我试图查看用户的读取权限,如果他有访问权限,则显示这些数据,这是一个具有userId键和true值的对象。我切换到一个数组,并将查询切换到。其中('access.readAccess','array contains',id)
,运行得非常顺利。很高兴您能正常工作。如果我的回答有帮助,请注明正确。
class
access.readAccess.`1571158795762` Ascending createdAt Descending
Collection
Enabled