Google cloud 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_

我有以下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_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要求对所有映射键进行索引。因此,维护动态密钥索引是不可伸缩的,应该不惜任何代价避免。