如何通过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
相关产品推荐
相关产品推荐

