Flutter 颤振Firestore更新(如果存在)(如果不创建)
我想知道是否存在特定文档,更新该文档,如果不存在,是否可以在Firestore中创建该文档。 例如,用户在post中输入了一些标记,然后显示如下Flutter 颤振Firestore更新(如果存在)(如果不创建),flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我想知道是否存在特定文档,更新该文档,如果不存在,是否可以在Firestore中创建该文档。 例如,用户在post中输入了一些标记,然后显示如下 Firestore.instance.collection('tags').document(标记在这里)。updateData()。 如果该文档不存在,那么有没有办法创建方法,或者在编写它之前我必须检查它是否存在?我不知道它具体如何与Flatter一起工作(我一生中没有写过一行Dart),但是其他客户端API允许第二个参数set()(或者在您的例子中
Firestore.instance.collection('tags').document(标记在这里)。updateData()
。
如果该文档不存在,那么有没有办法创建方法,或者在编写它之前我必须检查它是否存在?我不知道它具体如何与Flatter一起工作(我一生中没有写过一行Dart),但是其他客户端API允许第二个参数set()(或者在您的例子中是setData())这允许在文档不存在时创建文档,或者在文档已经存在时合并文档
有关其他语言的示例,请参见。这可能只是将
{merge:true}
作为第二个参数传递的问题,如web示例,或者可能使用SetOptions.merge()
如Java。Update
在较新的Firebase SDK上,语法已更改;Firebase是FirebaseFirestore,不推荐使用setData,而支持set+SetOptions
FirebaseFirestore.instance。
集合(“标记”)。
文件(标签)。
集合(数据,集合选项(合并:真))
@Doug是对的,Flatter Firestore API中有一个选项:
Firestore.instance.
collection('tags').
document(tag here).
setData(data, merge: true)
从文档:
setData(映射数据,{bool merge:false})→ 未来
写入此DocumentReference引用的文档。如果文档尚不存在,将创建该文档
如果merge为true,则提供的数据将合并到现有文档中,而不是覆盖
将其与updateData
中的文档进行比较,后者显式失败
updateData(地图数据)→ 未来
更新此DocumentReference引用的文档中的字段
如果尚未存在文档,更新将失败
从2020-03-31开始,您必须首先检查文档是否存在
setData(data,merge:true)
实际上不遵守merge
参数
我得到的行为相当于常规的setData()
,因此它会自动覆盖任何现有数据。昂贵的解决办法:
final Firestore _db = Firestore.instance;
final collection = 'my_collection';
final documentId = 'my_document';
final snapShot = await _db.collection(collection).document(documentId).get();
if(snapShot.exists){
_db.collection(collection).document(documentId).updateData(myMap);
} else {
_db.collection(collection).document(documentId).setData(myMap);
}
您要插入,最好的方法是:
Future updateUserFirestore(
String name,
String dob,
String email,
String sex
) {
return _getUserDetailsDocumentRef().update({
'name': name,
'dob': dob,
'email': email,
'sex': sex
}).catchError((e) => {
_getUserDetailsDocumentRef().set({
'name': name,
'dob': dob,
'email': email,
'sex': sex
}, SetOptions(merge: true))
});
}
2021年更新:
在文档上使用set
,并提供带有merge:true
的SetOptions
。从:
设置文档上的数据,覆盖任何现有数据。如果文档尚不存在,将创建该文档
如果提供了SetOptions,则数据将合并到现有文档中,而不是覆盖
var collection=FirebaseFirestore.instance.collection('collection');
收集
.doc(“doc\u id”)
.set(yourData,SetOptions(merge:true));
只是评论说这对我的web sdk也是相关的,Doug下面的回答也适用于此。如果没有文档存在,更新将失败
这是否会导致任何可能导致应用程序崩溃的错误?我想做类似的事情,但我不想使用documentId,我的查询是基于其他列的。您能帮忙吗?如果我理解正确,在上面的示例中,您可以将snapShot=
中的查询更改为您需要的任何查询。然后,在第一种情况下,snapShot.exists
,您将用.document(documentId)
替换.document(snapShot.document.documentId)
,使用快照的文档ID,即使您在查询中没有使用它。条件的后半部分可以保持不变,以通常的方式设置新文档的ID。