如果不存在,FireStore创建一个文档。
问题:FireStore如果文档不存在,则创建一个文档的原因以及解决方法。
解决方法:
如果需要使用created
和updated
时间戳,可以使用以下技术:
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 }); }
这将在文档不存在时创建一个带有created
和updated
时间戳的文档,但仅在文档存在时更改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}的原因,你是正确的,这没有意义。
问题: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方法的特殊语法来实现更复杂的操作。