【问题标题】:Set value of field in Firestore document only if the field hasn't already been set仅当尚未设置字段时才在 Firestore 文档中设置字段值
【发布时间】:2019-10-16 14:29:45
【问题描述】:

我有一个集合,其文档如下所示:

count: number
first: timestamp
last: timestamp

first 值应该(几乎)在文档创建后永远不会改变。

在批量写入操作中,我正在尝试更新此集合中的文档,或创建那些尚不存在的文档。类似的东西

batch.setData([
    "count": FieldValue.increment(someInteger),
    "first": someTimestamp,
    "last": someTimestamp
    ], forDocument: someDocumentRef, mergeFields: ["count","last"])

我的希望是,通过从 mergeFields 数组中排除 first,Firestore 将通过将 countlast 合并到现有文档或创建新文档来设置它,并且仅当它没有先前的值时才设置first(即,在此操作之前该文档不存在)。现在我很清楚事实并非如此,而是完全忽略了first。现在我想知道 Firestore 团队在这种情况下打算做什么。

我知道我可以通过事务来实现这一点,但这与我的批量写入不太吻合。交易是我唯一的选择,还是有更好的方法来实现这一点?

【问题讨论】:

  • 这对于我们基本上放在每个文档上的“创建”时间戳字段来说将是一个很棒的功能。避免读取步骤会很棒。可悲的是,它今天似乎不存在。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

我在我的文档中创建了时间戳和其他数据,我使用单独的创建和更新函数来处理它,而不是尝试一次完成所有操作。

初始创建函数包括创建日期等,然后后续更新使用非破坏性更新,因此只需省略更新负载中您不想覆盖的任何字段。

例如。创建:

batch.set(docRef, {created: someTimestamp, lastUpdate: someTimestamp})

然后更新:

batch.update(docRef, {lastUpdate: someTimestamp, someOtherField: someData})

这不会覆盖 creationDate 字段或任何其他字段,但如果 someOtherField 不存在,则会创建它。

如果您需要在第一次创建文档后进行“仅更新现有字段”更新,那么目前您必须先阅读文档以确定字段是否存在,然后创建一个更新有效负载将修补唯一所需的字段。这可以在事务中完成,或者您可以自己编写此逻辑,具体取决于您的需要。

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2022-09-25
    • 2016-12-07
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多