Firestore REST API 基于文档ID的WHERE IN查询实现报错及解决方案咨询
我来帮你搞定这个Firestore REST查询的问题!你遇到的报错主要是两个核心问题:文档ID在REST结构化查询中的表示方式错误,以及IN查询的参数结构不符合接口要求。
一、修复后的正确结构化查询
在Firestore REST API中,文档ID对应的特殊字段路径是__name__(而不是SDK里的FieldPath.documentId()),同时使用IN操作符时,数组值必须嵌套在value字段下的arrayValue中。以下是正确的代码示例:
const allowedIds = ['xxxx', 'zzzz', 'yyyy']; const structuredQuery = { 'from': [{ 'collectionId': 'myCollection' }], 'where': { 'fieldFilter': { 'field': { 'fieldPath': '__name__' // 使用__name__指代文档ID }, 'op': 'IN', 'value': { 'arrayValue': { 'values': allowedIds.map(id => ({ 'stringValue': id })) } } } } };
二、你的报错原因解析
文档ID字段路径错误:
你之前用了firebase.firestore.FieldPath.documentId()这个SDK对象作为字段路径,但Firestore REST接口只接受字符串类型的字段路径值,因此出现了Starting an object on a scalar field的错误。替换成__name__就可以正确识别文档ID字段。IN查询参数结构错误:
你直接把arrayValue作为fieldFilter的一级属性,但根据REST接口规范,当使用IN操作符时,必须将数组值放在value字段内部的arrayValue中——这就是你报错Cannot find field 'arrayValue'的直接原因。
三、针对你的最终需求的实现方案
你的场景是要查询vehicles集合中,文档ID存在于指定用户的vehicles数组字段中的数据。由于Firestore不支持跨集合的JOIN查询,需要分两步完成:
获取目标用户的vehicles数组
发送GET请求到Firestore REST接口,获取指定用户文档的vehicles字段值:GET https://firestore.googleapis.com/v1/projects/[你的项目ID]/databases/(default)/documents/users/[目标用户ID]从返回的JSON数据中提取
vehicles数组(注意返回的字段值结构是arrayValue.values,每个元素是stringValue)。用数组查询vehicles集合
把第一步得到的vehicles数组,代入上面的结构化查询模板中,将collectionId改为vehicles,然后发送查询请求即可得到符合条件的车辆文档。
内容的提问来源于stack exchange,提问作者raouaoul

