繁体   English   中英

Cloud Firestore 使用 REST API 更新嵌套字段

[英]Cloud Firestore update nested field using the REST API

我正在使用 GAS 构建一个 Google Docs 扩展,它使用 Firebase 的 Cloud Firestore。
我有一个名为GROUPS的集合,在该集合下我有一个名为Test的测试文档,其中包含以下字段:

{
  DISPLAY_IDS: {
    TYPE1: [array_of_numbers],
    TYPE2: [array_of_numbers],
    TYPE3: [array_of_numbers],
  }
}

我每次都需要更新一个特定的TYPE (每次整个数组,不需要能够推送一个元素或类似的东西)。
我已经看到,为了使用常规的 JS API 来执行此操作,您可以使用点表示法,并这样做:

firestore.collection("GROUPS").document("Test").update({
  "DISPLAY_IDS.TYPE2": new_array_of_numbers,
});

所以使用 REST API 我假设它会被翻译成:

payload: {
  fields: {
    "DISPLAY_IDS.TYPE2": new_array_of_numbers
  }
}
url: "https://firestore.googleapis.com/v1beta1/projects/{projectId}/databases/{databaseId}/documents/GROUPS/Test?updateMask.fieldPaths=DISPLAY_IDS.TYPE2"

然而这并没有奏效,而是在DISPLAY_IDS之外创建了一个名为DISPLAY_IDS.TYPE2的新字段。
在互联网上查看了一下后,我也尝试了以下请求:

payload: {
  fields: {
    DISPLAY_IDS: {
      TYPE2: new_array_of_numbers,
    }
  }
}
url: "https://firestore.googleapis.com/v1beta1/projects/{projectId}/databases/{databaseId}/documents/GROUPS/Test?updateMask.fieldPaths=DISPLAY_IDS"

但是这里发生的事情是DISPLAY_IDS被完全覆盖,其他类型被删除。

我还尝试了上述方法的组合,因此有效负载没有点符号,而掩码带有点符号,但这根本没有更新数据库(我认为这是有道理的,因为文档指出如果字段出现在掩码中但不在有效负载中,然后它将被删除(但字段DISPLAY_IDS.TYPE2 (不是嵌套的,只是这个名称)已经不存在)以及在有效负载中但不在有效负载中的字段掩码将被忽略)。

使用 REST API 仅更新TYPE2嵌套字段的正确方法是什么?

您可以指定一个mapValue ,如下所示:

{
  "fields": {
    "DISPLAY_IDS": {
      "mapValue": {
        "fields": {
          "TYPE2": {
            "stringValue": "UPDATED VALUE"
          }
        }
      }
    }
  }
}

您必须在updateMask.fieldPaths查询参数中指定DISPLAY_IDS.TYPE2否则文档中的其他字段将被删除。 只需 append 到您的 API URL 这样做:

?updateMask.fieldPaths=DISPLAY_IDS.TYPE2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM