firebase Firestore使用Rest API更新文档字段

rqenqsqc  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(149)

我试图在云firestore中使用REST API执行补丁操作。
这是我的请求正文

`{
  "fields": {
    "name": {
      "stringValue":"Dinesh"
    }
  }
}`

当我发出请求时,文档中所有现有的字段都被删除,只有名称字段被更新。在文档中,他们给出了Document Mask。但我不明白它是如何工作的,我也找不到任何示例。有人知道如何在不影响其他字段的情况下只更新文档中的一个字段吗?

gojuced7

gojuced71#

如果没有DocumentMask对象,patch方法默认使用请求正文替换Firestore文档,而不是更新提交的字段并保留省略的字段。
DocumentMask作为一个updateMask参数提交,其中包含要修补的fieldPath。这花了一段时间,但经过thanks to this answer和多次尝试,我发现updateMask对象的每个fieldPath属性都需要单独包含在请求URL的查询字符串中:
https://firestore.googleapis.com/v1beta1/projects/{projectId}/databases/{databaseId}/documents/{document_path}?updateMask.fieldPaths=status&updateMask.fieldPaths=title
其中statustitle是请求正文中的两个字段。请注意,如果查询字符串中省略了请求正文中包含的字段,则这些字段将被忽略,保持不变。

mwkjh3gx

mwkjh3gx2#

下面是firestore中的另一个json结构示例

"fields": {
    "eth0": {
      "mapValue": {
        "fields": {
          "address": {
            "stringValue": "172.0.0.1"
          },
          "port": {
            "stringValue": "8080"
          },
          "endpoint": {
            "stringValue": "10.0.5.24"
          }
        }
      }
    }
  }

然后只更新endpoint字段

curl -sSLX PATCH \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Content-type: application/json" \
  -d "{
    \"fields\": {
      \"eth0\": {
        \"mapValue\": {
          \"fields\": {
            \"endpoint\": {
              \"stringValue\": \"10.10.2.24\"
            }
          }
        }
      }
    }
  }" \
  "https://firestore.googleapis.com/v1/projects/{project-id}/databases/(default)/documents/{collection}/{document}?updateMask.fieldPaths=eth0.endpoint")
busg9geu

busg9geu3#

您的请求主体没有问题。但是您需要使用更新掩码。
通过阅读文档,我发现DocumentMask用于将文档上的get或update操作限制在其字段的子集上。因此,通过在掩码上的字段路径中添加“name”,它将只允许您更新该特定字段,而其他字段不会被删除。
你可以阅读更多关于它here

相关问题