【问题标题】:FireStore create a document if not existFireStore 如果不存在则创建一个文档
【发布时间】:2019-02-16 00:33:30
【问题描述】:

我想更新这样的文档:

db.collection('users').doc(user_id).update({foo:'bar'})

但是,如果文档 user_id 不存在,上面的代码会抛出错误。 因此,如果不存在,如何告诉 Firestore 创建学生,换句话说,行为如下:

db.collection('users').doc(user_id).set({foo:'bar'})

【问题讨论】:

  • set方法有什么问题?
  • 我希望 Firestore 在更新方法失败时自动创建文档。因为 Firestore 无法更新不存在的文档,所以它不起作用
  • 这里的答案是正确的,文档中有讨论:firebase.google.com/docs/firestore/manage-data/…
  • 对于遇到此问题的人,如果文档已经存在,rejecting set 的要求略有不同,请参阅我的回答 here

标签: node.js firebase google-cloud-firestore


【解决方案1】:

我认为您想使用以下代码:

db.collection('users').doc(user_id).set({foo:'bar'}, {merge: true})

这将使用提供的数据设置文档,并保持其他文档字段不变。最好当您不确定文档是否存在时。只需传递选项以将新数据与任何现有文档合并,以避免覆盖整个文档。

有关使用 Firestore 管理数据的更多详细信息,请查看 this link

【讨论】:

  • 请注意,它与使用更新不同 - 如果您删除模型中的字段(使用 js "delete" 关键字)并使用 "set+merge" 该字段将保留在数据库中,而使用更新将按预期删除数据库中的字段。可能的方法可能是不使用js delete,而是将字段设置为null。
  • 在我的情况下,我需要使用 update("field_name", admin.firestore.Fieldvalue.increment(1)) 增加一个计数器。合并选项不适用于这种情况。我如何做到这一点?
  • 有人知道 Go 中的等价语句吗?
  • @AndyFusniak 你可以在这里找到对应的 Go:firebase.google.com/docs/firestore/manage-data/…,在第二个示例中,单击“更多”下拉菜单以找到 Go。
  • 绝对漂亮
【解决方案2】:

如果您需要 createdupdated 时间戳之类的东西,您可以使用这种技术:

let id = "abc123";
let email = "john.doe@gmail.com";
let name = "John Doe";
let document = await firebase.firestore().collection("users").doc(id).get();
if (document && document.exists) {
  await document.ref.update({
    updated: new Date().toISOString()
  });
}
else {
  await document.ref.set({
    id: id,
    name: name,
    email: email,
    created: new Date().toISOString(),
    updated: new Date().toISOString()
  }, { merge: true });
}

如果文档不存在 createdupdated 时间戳,这将创建该文档,但仅更改 updated 时间戳(如果存在)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2014-01-02
  • 2016-06-18
相关资源
最近更新 更多