Flutter 颤振Firestore更新(如果存在)(如果不创建)

Flutter 颤振Firestore更新(如果存在)(如果不创建),flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我想知道是否存在特定文档,更新该文档,如果不存在,是否可以在Firestore中创建该文档。 例如,用户在post中输入了一些标记,然后显示如下 Firestore.instance.collection('tags').document(标记在这里)。updateData()。 如果该文档不存在,那么有没有办法创建方法,或者在编写它之前我必须检查它是否存在?我不知道它具体如何与Flatter一起工作(我一生中没有写过一行Dart),但是其他客户端API允许第二个参数set()(或者在您的例子中

我想知道是否存在特定文档,更新该文档,如果不存在,是否可以在Firestore中创建该文档。 例如,用户在post中输入了一些标记,然后显示如下
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。