如果不存在,FireStore创建一个文档。

8 浏览
0 Comments

如果不存在,FireStore创建一个文档。

我想更新一个文档,类似于这样:\n

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

\n然而,如果文档 user_id 不存在,上述代码会抛出一个错误。\n因此,如何告诉 Firestore 如果不存在就创建文档,换句话说,像这样操作:\n

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

0
0 Comments

问题:FireStore如果文档不存在,则创建一个文档的原因以及解决方法。

解决方法:

如果需要使用createdupdated时间戳,可以使用以下技术:

let id = "abc123";
let email = "john.doe.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时间戳。

其他建议:

您还可以查看Firestore事务:[firebase.google.com/docs/firestore/manage-data/transactions](https://firebase.google.com/docs/firestore/manage-data/transactions)

永远不要在Firestore中使用客户端时间戳,始终使用FieldValue.serverTimestamp()

关于时间戳的问题,我不同意。Firebase时间戳是带有附加方法的对象。如果将数据传输到其他系统(例如关系型数据库),您将丢失这些方法,可能会导致问题。出于这个原因,我们始终使用UTC时间戳。

关于在先前的检查中已经知道文档不存在的情况下为什么要使用{merge:true}的原因,你是正确的,这没有意义。

0
0 Comments

问题:FireStore如何在文档不存在时创建一个文档,并提供解决方法。

原因:在使用FireStore时,有时候需要创建一个文档,但又不确定该文档是否已经存在。如果直接使用set方法来设置文档数据,会导致覆盖整个文档的情况发生。因此需要一种方法来判断文档是否存在,并在不存在时创建文档。

解决方法:可以使用以下代码来实现在文档不存在时创建文档的功能:

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

通过在set方法中传递merge选项为true,可以实现将新数据与已有文档合并的效果,避免覆盖整个文档。

需要注意的是,这与使用update方法是不同的。如果使用JavaScript的delete关键字删除模型中的某个字段,并使用set+merge方法,该字段将保留在数据库中,而使用update方法则会按预期从数据库中删除该字段。因此,可以将字段设置为null来代替使用delete关键字。

对于需要使用update方法进行字段自增的情况,merge选项无法实现该功能。可以使用update方法的特殊语法来实现自增功能,例如:update("field_name", admin.firestore.Fieldvalue.increment(1))。

如果想了解更多关于使用FireStore管理数据的详细信息,可以参考官方文档中的相关内容:https://firebase.google.com/docs/firestore/manage-data/add-data

通过在set方法中传递merge选项为true,可以在文档不存在时创建文档,并实现数据合并的效果。对于特殊需求,可以使用update方法的特殊语法来实现更复杂的操作。

0