javascript - 仅当尚未设置该字段时,才在 Firestore 文档中设置该字段的值

标签 javascript firebase google-cloud-firestore

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

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

在批量写入操作中,我试图更新此集合中的文档,或创建尚不存在的那些文档。就像是
batch.setData([
    "count": FieldValue.increment(someInteger),
    "first": someTimestamp,
    "last": someTimestamp
    ], forDocument: someDocumentRef, mergeFields: ["count","last"])

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

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

最佳答案

我在我的文档中创建了时间戳和其他数据,我使用单独的创建和更新函数来处理这个问题,而不是试图一次完成所有这些。

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

例如。创造:

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

然后更新:
batch.update(docRef, {lastUpdate: someTimestamp, someOtherField: someData})

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

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

关于javascript - 仅当尚未设置该字段时,才在 Firestore 文档中设置该字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56386623/

相关文章:

firebase - Firebase 云功能的 SSL 证书

javascript - 在react-native中运行之前,如何让应用程序等待从从firestore获取数据的模块获取所有数据?

javascript - PHP 多个查询字符串值到数组

php - 边栏 Google Maps API v3 使用 PHP/MYSQL 提取数据

ios - Firebase queryEqualToValue 在 Swift 2.3 中获取 Key

ios - Firebase 动态链接在 safari swift 中不起作用

javascript - 一起使用 jQuery timeago 或 momentjs 和 AngularJS

javascript - 为什么 addEventListener 点击不起作用?

java - 如何从具有相同ID的特定子节点检索数据

android - 如何从任务中删除监听器?