Google cloud firestore 如何在地图中的动态字段上创建Firestore索引?
我有以下Firestore文档结构:Google cloud firestore 如何在地图中的动态字段上创建Firestore索引?,google-cloud-firestore,Google Cloud Firestore,我有以下Firestore文档结构: status: "active" updatedAt: October 8, 2020 at 3:44:29 PM UTC+3 accessControl (map) OwiGbKk37XQmXjrFok8J7cXEtOr1: "write" 我的问题如下: const uid = 'OwiGbKk37XQmXjrFok8J7cXEtOr1' await db .collection(COLLECTION_
status: "active"
updatedAt: October 8, 2020 at 3:44:29 PM UTC+3
accessControl (map)
OwiGbKk37XQmXjrFok8J7cXEtOr1: "write"
我的问题如下:
const uid = 'OwiGbKk37XQmXjrFok8J7cXEtOr1'
await db
.collection(COLLECTION_NAME)
.orderBy('status', 'desc')
.orderBy('updatedAt', 'desc')
.where('accessControl.' + uid, '==', 'write')
.get()
只要我删除.orderBy
子句并避免添加更多.where
子句,这就行了。如果我想订购或筛选tho,Firestore会要求我添加一个带有特定UID的索引,这对于缩放来说是不可能的,而且该字段是动态生成的
我尝试过单字段索引例外,但没有成功
Firestore文档不包括这种典型情况,不知什么原因,有什么解决方法吗?此文档结构不适用于您希望执行的查询类型。您应该考虑使用一个列表字段,该字段包含可以写入的用户的UID:
status: "active"
updatedAt: October 8, 2020 at 3:44:29 PM UTC+3
writeAccess: (list)
[0] OwiGbKk37XQmXjrFok8J7cXEtOr1
然后,您可以使用数组contains进行如下查询:
const uid = 'OwiGbKk37XQmXjrFok8J7cXEtOr1'
await db
.collection(COLLECTION_NAME)
.where('writeAccess', 'array-contains', uid)
.orderBy('status', 'desc')
.orderBy('updatedAt', 'desc')
.get()
有关更多信息,请参阅文档。Hi@Doug,谢谢你,这正是我解决问题的方法!这个问题的根本答案是Firestore要求对所有映射键进行索引。因此,维护动态密钥索引是不可伸缩的,应该不惜任何代价避免。