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

用R调用Firestore REST API查询指定字段值遇400错误如何解决?

解决Cloud Firestore REST API查询的400错误(R语言实现)

问题背景

我正在使用R语言通过Cloud Firestore REST API进行数据的GET和POST操作,目标是获取Demographics集合中Instructor字段等于instructor2@fssi.com的所有文档数据(文档以用户邮箱命名)。

初始读取函数

library(httr)
library(jsonlite)

read.db <- function(db_endpoint, auth_token) {
  r <- GET(
    sprintf("https://firestore.googleapis.com/v1beta1/%s", db_endpoint),
    add_headers(
      "Content-Type" = "application/json",
      "Authorization" = paste("Bearer", auth_token)
    )
  )
  return(r)
}

修改后的查询函数(触发400错误)

read.db <- function(db_endpoint, auth_token) {
  query <- list(
    structuredQuery = list(
      from = list(
        collectionId = "Demographics",
        allDescendants = TRUE
      ),
      where = list(
        fieldFilter = list(
          field = list(
            fieldPath = "Instructor"
          ),
          op = "EQUAL",
          value = list(
            stringValue = "instructor2@fssi.com"
          )
        )
      )
    )
  )
  
  r <- POST(
    sprintf("https://firestore.googleapis.com/v1beta1/%s:runQuery", db_endpoint),
    body = toJSON(query),
    add_headers(
      "Content-Type" = "application/json",
      "Authorization" = paste("Bearer", auth_token)
    )
  )
  
  return(r)
}
response <- read.db("projects/MY-PROJECT/databases/(default)/documents", "MY-accessToken")

返回的400错误信息

Response [https://firestore.googleapis.com/v1beta1/projects/MY-PROJECT/databases/(default)/documents:runQuery]
  Date: 2023-10-17 12:35
  Status: 400
  Content-Type: application/json; charset=UTF-8
  Size: 1.87 kB
[{
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unknown name \"collectionId\" at 'structured_query.from': Proto field is n...
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
...

解决方案

错误原因

Firestore REST API的:runQuery接口要求structuredQuery.from是数组类型,但原代码直接传入了单个对象;同时jsonlite的toJSON默认会自动简化单元素数组为单个对象,导致API无法识别格式。

修正后的代码

library(httr)
library(jsonlite)

read.db <- function(db_endpoint, auth_token) {
  query <- list(
    structuredQuery = list(
      from = list(
        list(  # 嵌套列表确保生成JSON数组格式
          collectionId = "Demographics",
          allDescendants = TRUE
        )
      ),
      where = list(
        fieldFilter = list(
          field = list(
            fieldPath = "Instructor"
          ),
          op = "EQUAL",
          value = list(
            stringValue = "instructor2@fssi.com"
          )
        )
      )
    )
  )
  
  r <- POST(
    sprintf("https://firestore.googleapis.com/v1beta1/%s:runQuery", db_endpoint),
    body = toJSON(query, auto_unbox = FALSE),  # 禁用自动解包,保留数组结构
    add_headers(
      "Content-Type" = "application/json",
      "Authorization" = paste("Bearer", auth_token)
    )
  )
  
  return(r)
}

# 调用并解析结果
response <- read.db("projects/MY-PROJECT/databases/(default)/documents", "MY-accessToken")
result <- fromJSON(content(response, "text"))
print(result)

关键修改点

  • 将from字段的内容包裹在额外的list()中,确保生成[{"collectionId": "...", ...}]的数组格式
  • 在toJSON中添加auto_unbox = FALSE参数,避免单元素数组被扁平化,完全匹配Firestore API的格式要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:00:28