You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore REST API 基于文档ID的WHERE IN查询实现报错及解决方案咨询

解决Firestore REST API中WHERE IN查询文档ID的问题

我来帮你搞定这个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 }))
        }
      }
    }
  }
};

二、你的报错原因解析

  1. 文档ID字段路径错误:
    你之前用了firebase.firestore.FieldPath.documentId()这个SDK对象作为字段路径,但Firestore REST接口只接受字符串类型的字段路径值,因此出现了Starting an object on a scalar field的错误。替换成__name__就可以正确识别文档ID字段。

  2. IN查询参数结构错误:
    你直接把arrayValue作为fieldFilter的一级属性,但根据REST接口规范,当使用IN操作符时,必须将数组值放在value字段内部的arrayValue中——这就是你报错Cannot find field 'arrayValue'的直接原因。

三、针对你的最终需求的实现方案

你的场景是要查询vehicles集合中,文档ID存在于指定用户的vehicles数组字段中的数据。由于Firestore不支持跨集合的JOIN查询,需要分两步完成:

  1. 获取目标用户的vehicles数组
    发送GET请求到Firestore REST接口,获取指定用户文档的vehicles字段值:

    GET https://firestore.googleapis.com/v1/projects/[你的项目ID]/databases/(default)/documents/users/[目标用户ID]
    

    从返回的JSON数据中提取vehicles数组(注意返回的字段值结构是arrayValue.values,每个元素是stringValue)。

  2. 用数组查询vehicles集合
    把第一步得到的vehicles数组,代入上面的结构化查询模板中,将collectionId改为vehicles,然后发送查询请求即可得到符合条件的车辆文档。

内容的提问来源于stack exchange,提问作者raouaoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:12:41