我已经搜索了很长时间,但是我不知道如何使用Firestore REST API更新文档中的字段。我查看了其他问题,但由于遇到其他错误,它们没有帮助我。
{'错误':{'代码':400,'消息':'请求包含无效的参数。','状态':'INVALID_ARGUMENT','细节':[{'@type':'类型。 googleapis.com/google.rpc.BadRequest','fieldViolations':[{'field':'oil','description':“扩展'fields'参数时出错。找不到路径'oil'的匹配字段。”}] }]}}
即使我知道文档中存在“石油”字段,也遇到了此错误。我是用Python编写的。
我的请求正文(字段是文档中的字段,值是将该字段设置为从用户输入接收到的两个字符串的值):
{
"fields": {
field: {
"integerValue": value
}
}
}
我的请求(authorizationToken来自其他请求,dir也是来自控制目录的用户输入的字符串):
requests.patch("https://firestore.googleapis.com/v1beta1/projects/aethia-resource-management/databases/(default)/documents/" + dir + "?updateMask.fieldPaths=" + field, data = body, headers = {"Authorization": "Bearer " + authorizationToken}).json()
答案 0 :(得分:0)
根据您提供的示例,基于官方文档(1,2和3,GitHub和nice article应该使用以下内容:
requests.patch(“ https://firestore.googleapis.com/v1beta1/projects {projectId} / databases / {databaseId} / documents / {document_path}?updateMask.fieldPaths = field”)
您的请求正文应为:
{
"fields": {
"field": {
"integerValue": Value
}
}
}
还请记住,如果要更新多个字段和值,则应分别指定每个字段和值。 示例:
https://firestore.googleapis.com/v1beta1/projects/{projectId}/databases/{databaseId}/documents/{document_path}?updateMask.fieldPaths=[Field1]&updateMask.fieldPaths=[Field2]
和请求正文将是:
{
"fields": {
"field": {
"integerValue": Value
},
"Field2": {
"stringValue": "Value2"
}
}
}
编辑:
这是我测试过的一种方法,它使您可以更新文档的某些字段而不会影响其余字段。
此示例代码在具有4个字段的集合用户下创建了一个文档,然后尝试更新4个字段中的3个(这使未提及的字段不受影响)
from google.cloud import firestore
db = firestore.Client()
#Creating a sample new Document “aturing” under collection “users”
doc_ref = db.collection(u'users').document(u'aturing')
doc_ref.set({
u'first': u'Alan',
u'middle': u'Mathison',
u'last': u'Turing',
u'born': 1912
})
#updating 3 out of 4 fields (so the last should remain unaffected)
doc_ref = db.collection(u'users').document(u'aturing')
doc_ref.update({
u'first': u'Alan',
u'middle': u'Mathison',
u'born': 2000
})
#printing the content of all docs under users
users_ref = db.collection(u'users')
docs = users_ref.stream()
for doc in docs:
print(u'{} => {}'.format(doc.id, doc.to_dict()))
编辑:2019年12月12日
具有REST API的补丁
我已转载了您的问题,看来您没有将请求正文正确转换为json格式。
您需要使用json.dumps()
将请求正文转换为有效的json格式。
以下是一个工作示例:
import requests
import json
endpoint = "https://firestore.googleapis.com/v1/projects/[PROJECT_ID]/databases/(default)/documents/[COLLECTION]/[DOCUMENT_ID]?currentDocument.exists=true&updateMask.fieldPaths=[FIELD_1]"
body = {
"fields" : {
"[FIELD_1]" : {
"stringValue" : "random new value"
}
}
}
data = json.dumps(body)
headers = {"Authorization": "Bearer [AUTH_TOKEN]"}
print(requests.patch(endpoint, data=data, headers=headers).json())
答案 1 :(得分:0)
我发现官方文档没什么用,因为没有提到任何示例。这是您的Firestore数据库的API端点
以下代码是您的API请求的正文
{
"fields": {
"first_name": {
"stringValue":"Kurt"
},
"name": {
"stringValue":"Cobain"
},
"band": {
"stringValue":"Nirvana"
}
}
}
成功更新数据库后应获得的响应应该是
{
"name": "projects/{YOUR_PROJECT_ID}/databases/(default)/documents/{COLLECTION_ID/{DOC_ID}",
{
"fields": {
"first_name": {
"stringValue":"Kurt"
},
"name": {
"stringValue":"Cobain"
},
"band": {
"stringValue":"Nirvana"
}
}
"createTime": "{CREATE_TIME}",
"updateTime": "{UPDATE_TIME}"
请注意,执行上述操作将导致创建新文档,这意味着将删除先前存在但未在“字段”正文中提及的任何字段。为了保留字段,您必须添加
?updateMask.fieldPaths={FIELD_NAME} --> to the end of your API call (for each individual field that you want to preserve).
For example:
PATCH https://firestore.googleapis.com/v1beta1/projects/{YOUR_PROJECT_ID}/databases/(default)/documents/{COLLECTION_NAME}/{DOCUMENT_NAME}?updateMask.fieldPaths=name&updateMask.fieldPaths=band&updateMask.fieldPaths=age. --> and so on