Firestore嵌套文档字段查询:现有结构下如何查询Paris位置的count值
Firestore structuredQuery 查询解决方案
问题原因
你触发报错的核心原因是在子路径下的runQuery请求中开启了allDescendants: true,该参数会触发集合组查询,而Firestore要求集合组查询必须在数据库根路径发起。同时你对集合组索引的规则存在误解:集合组索引是全局按集合ID匹配的,只要你所有变体的集合名都统一叫variantName,只需要创建1次集合组索引即可,不需要为每个productId单独配置豁免。
方案1:不使用集合组查询(仅查询单个productId下的variantName集合,无需额外建索引)
不需要修改现有数据结构,也不需要建集合组索引,直接调整请求参数即可:
- 请求地址保持你原来的路径即可:
https://firestore.googleapis.com/v1/projects/projectName/databases/(default)/documents/ProductInventories/productId1:runQuery - 修改
structuredQuery中的allDescendants为false,表示只查询当前父文档下的直接子集合variantName,不触发集合组查询,正确请求体如下:
{ "structuredQuery": { "from": [ { "collectionId": "variantName", "allDescendants": false } ], "where": { "fieldFilter": { "field": { "fieldPath": "location" }, "op": "EQUAL", "value": { "stringValue": "Paris" } } }, "select": { "fields": [ { "fieldPath": "count" } ] } } }
注:新增的
select字段是可选配置,加上后只会返回你需要的count字段,减少返回数据体积。
方案2:需要跨所有productId查询所有variantName集合中符合条件的数据
这种情况必须使用集合组查询,操作如下:
- 先在Firebase控制台创建1次集合组索引,集合ID填
variantName,索引字段选location升序/降序均可,生效后所有productId下的variantName集合都可以被查询到,无需逐个配置 - 请求地址改为根路径:
https://firestore.googleapis.com/v1/projects/projectName/databases/(default)/documents:runQuery - 请求体保留
allDescendants: true,同时可以额外加where条件限定父文档路径筛选指定productId范围,不需要全库查询。
内容的提问来源于stack exchange,提问作者David Min
相关产品推荐
相关产品推荐

