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

如何通过REST API向Firestore提交数据并创建可查询的有效文档

问题描述

我需要通过REST API向Firestore提交层级数据结构:Block集合 → House2文档 → Floor1文档 → Ground文档,其中Ground包含Name: Ground字段。

手动创建时,先建House1文档,再创建Floor1和Ground文档,能得到正常可查询的文档。但使用R的REST API代码时,仅创建了带Name字段的Ground文档,House2和Floor1被Firestore标记为“不存在的文档”,无法被查询。

原R代码如下:

library(httr)
library(jsonlite)

# POST function
post_data_to_firestore <- function(path, data, auth_token) {
  r <- httr::POST(
    url = sprintf("https://firestore.googleapis.com/v1beta1/%s", path),
    config = httr::add_headers(
      "Content-Type" = "application/json",
      "Authorization" = paste("Bearer", auth_token)
    ),
    body = data
  )
  return(r)
}

PROJECT_NAME <- "firebase-project"
COLLECTION <- "Block"
accessTokenu <- "access-token"

endpoint <- paste0("projects/", PROJECT_NAME, "/databases/(default)/documents/", COLLECTION)

data_list <- toJSON(
    list(
    fields = list(
      Name = list("stringValue" = "Ground")
    )
  ), auto_unbox = TRUE
)

post_data_to_firestore(
  path = paste0(endpoint, "/House2/Floor1", "?documentId=", "Ground"),
  data = data_list,
  auth_token = accessTokenu
)
解决方案

Firestore中,仅通过创建子文档生成的父文档是幽灵文档——仅作为路径占位,无实际数据,无法被查询。要创建可查询的有效父文档,需显式创建每个层级的文档,哪怕父文档只包含基础字段或空字段。

修改后的R代码示例:

library(httr)
library(jsonlite)

# POST function
post_data_to_firestore <- function(path, data, auth_token) {
  r <- httr::POST(
    url = sprintf("https://firestore.googleapis.com/v1beta1/%s", path),
    config = httr::add_headers(
      "Content-Type" = "application/json",
      "Authorization" = paste("Bearer", auth_token)
    ),
    body = data
  )
  return(r)
}

PROJECT_NAME <- "firebase-project"
COLLECTION <- "Block"
accessTokenu <- "access-token"

base_endpoint <- paste0("projects/", PROJECT_NAME, "/databases/(default)/documents/", COLLECTION)

# 1. 显式创建House2文档
house2_data <- toJSON(list(fields = list(Name = list(stringValue = "House2"))), auto_unbox = TRUE)
post_data_to_firestore(
  path = paste0(base_endpoint, "?documentId=House2"),
  data = house2_data,
  auth_token = accessTokenu
)

# 2. 显式创建Floor1文档
floor1_data <- toJSON(list(fields = list(Name = list(stringValue = "Floor1"))), auto_unbox = TRUE)
post_data_to_firestore(
  path = paste0(base_endpoint, "/House2?documentId=Floor1"),
  data = floor1_data,
  auth_token = accessTokenu
)

# 3. 创建Ground文档
ground_data <- toJSON(list(fields = list(Name = list(stringValue = "Ground"))), auto_unbox = TRUE)
post_data_to_firestore(
  path = paste0(base_endpoint, "/House2/Floor1?documentId=Ground"),
  data = ground_data,
  auth_token = accessTokenu
)

关键说明

  • 每个层级的文档都需要通过独立的POST请求显式创建,确保每个文档都有实际字段数据(哪怕是一个简单的Name字段)。
  • 若不需要父文档有额外字段,也可提交空的fields对象(list(fields = list())),只要显式创建文档即可使其成为有效可查询文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:22:47