Firestore写入报错:Cannot bind a list to map for field 'fields' 求助
Firestore写入错误:Cannot bind a list to map for field 'fields'
问题场景
拥有配备Firestore数据库的Firebase项目,尝试通过R语言的POST请求向文档写入JSON对象,使用的函数代码如下:
write.db <- function(db_endpoint, data, auth_token) { r <- POST(db_endpoint, add_headers("Content-Type" = "application/json", "Authorization" = paste("Bearer", auth_token)), body = data) return(r) }
待写入的JSON对象格式:
{ fields: [ {obj1} {obj2} ... ] }
每次写入返回错误:
"error": { "code": 400, "message": "Invalid value at 'document' (Map), Cannot bind a list to map for field 'fields'.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.BadRequest", "fieldViolations": [ { ...
错误原因及修正方法
1. JSON格式错误:fields应为对象而非数组
Firestore REST API要求文档的fields是键值对对象(Map),而非数组(列表)。你当前用[]定义fields,完全不符合Firestore的文档结构规范。
正确的JSON格式示例:
{ "fields": { "obj1": { "stringValue": "你的第一个对象值" }, "obj2": { "integerValue": 123 } } }
每个字段需要指定Firestore的类型(如stringValue、integerValue、mapValue等),确保字段值匹配Firestore的类型定义。
2. R中JSON转换的细节问题
如果你的data参数是R的列表对象,直接传入POST的body可能会导致JSON结构异常。需要用jsonlite::toJSON()转换,并开启auto_unbox = TRUE,避免R将单元素列表自动转为数组。
修改后的函数:
write.db <- function(db_endpoint, data, auth_token) { # 将R列表转换为符合要求的JSON格式,自动拆箱单元素 json_data <- jsonlite::toJSON(data, auto_unbox = TRUE) r <- POST(db_endpoint, add_headers("Content-Type" = "application/json", "Authorization" = paste("Bearer", auth_token)), body = json_data) return(r) }
调用时,data需要是符合Firestore结构的R列表,比如:
data_list <- list( fields = list( obj1 = list(stringValue = "test1"), obj2 = list(integerValue = 456) ) )
内容的提问来源于stack exchange,提问作者Andrew Colin
相关产品推荐
相关产品推荐

