首页 > 解决方案 > 更新 firestore 文档嵌套数据会覆盖它

问题描述

我正在尝试在 Firestore 文档中的嵌套字典中设置一些新字段,这会导致数据被覆盖。这是我写我需要的信息的第一部分的地方:

upd = {
"idOffer": {
                <offerId> : {
                    "ref" : <ref>,
                    "value" : <value>
                }
            }
}
<documentRef>.update(upd)

所以这里的输出是这样的:

<documentid>:{idOffer:{<offerId>:{ref:<ref>, value:<value>}}}

然后我使用这段代码将一些字段添加到当前<offerId>嵌套数据中:

approval = {
            "isApproved" : <bool>,
            "dateApproved" : <date>,
            "fullApproval" : <bool>
        }
<documentRef>.update({
            "idOffer.<offerId>" : approval
        })

我希望从中得到:

<documentid>:{idOffer:{<offerId>:{ref:<ref>, value:<value>, isApproved:<bool>,dateApproved:<date>,fullApproval:<bool>}}}

但我最终得到:

<documentid>:{idOffer:{<offerId>:{isApproved:<bool>,dateApproved:<date>,fullApproval:<bool>}}}

注意:我使用 <> 来引用动态数据,例如文档 ID 或引用。

标签: python-3.xgoogle-cloud-platformgoogle-cloud-firestore

解决方案


当您使用字典(或映射、对象或其他语言中使用的任何键/值对结构)调用更新时,给定顶级键后面的整个数据集将被替换。因此,如果您使用 键调用 update idOffer.<offerId>,则该键下的所有内容都将被替换,而该级别的所有其他子键idOffer将保持不变。

如果您不想替换键后面的整个对象,请更具体地说明您要更新哪些子对象。在您的示例中,不是更新单个idOffer.<offerId>键,而是为嵌套子级指定三个键:

  • idOffer.<offerId>.isApproved
  • idOffer.<offerId>.dateApproved
  • idOffer.<offerId>.fullApproval

也就是说,您传递的字典在顶层应该有三个这样的键值条目,而不是idOffer.<offerId>.


推荐阅读