在 Dart 的 Cloud Firestore 中添加文档后如何获取文档 ID

Posted

技术标签:

【中文标题】在 Dart 的 Cloud Firestore 中添加文档后如何获取文档 ID【英文标题】:How do you get the document id after adding document in Cloud Firestore in Dart 【发布时间】:2018-12-05 20:35:54 【问题描述】:

我使用以下代码使用 Dart/Flutter 更新 Cloud Firestore 集合。

  final docRef = Firestore.instance.collection('gameLevels');
  docRef.document().setData(map).then((doc) 
    print('hop');
  ).catchError((error) 
    print(error);
  );

我试图获取在将文档添加到集合时创建的 documentID,但 (doc) 参数返回为 null。我以为它应该是一个文档引用?

既然是null,我显然不能使用doc.documentID。

我做错了什么?

【问题讨论】:

【参考方案1】:

如果 Dart API 与其他平台类似,document() 方法应该返回一个文档引用,该引用具有一个 id 属性,该属性带有随机生成的即将添加到集合中的文档的 id。

【讨论】:

它在 Flutter 中的工作方式不同(与 android/ios 相比)。调用 doc() 将返回到文档的路径,它看起来像这样 DocumentReference(rooms/nJxQna0G7Zay4VHvyZz5/messages/c9cI7YjXOy9SMH2NFzEn) 我的错,我忘了打印文档的 ID 变量。应该是正确答案。【参考方案2】:

您可以尝试以下方法:

DocumentReference docRef = await 
Firestore.instance.collection('gameLevels').add(map);
print(docRef.documentID);

由于 add() 方法创建新文档并自动生成 id,因此您不必显式调用 document() 方法

或者,如果您想使用“then”回调,请尝试以下操作:

  final collRef = Firestore.instance.collection('gameLevels');
  DocumentReferance docReference = collRef.document();

  docReferance.setData(map).then((doc) 
    print('hop $docReferance.documentID');
  ).catchError((error) 
    print(error);
  );

【讨论】:

如何为我的文档提供自定义 ID?我这样做了,但发生空指针异常 db.collection('users').document(uid).setData(data);数据库中不存在该 ID 的文档。我要添加它 你的语法是正确的。您能否提供准确的错误日志以缩小问题范围?还要检查 uid、数据变量中存在的值,以确保它们不为空。【参考方案3】:

使用value.id,添加到FireStore后即可获取documentId

CollectionReference users = FirebaseFirestore.instance.collection('candidates');
  

      Future<void> registerUser() 
     // Call the user's CollectionReference to add a new user
         return users.add(
          'name': enteredTextName, // John Doe
          'email': enteredTextEmail, // Stokes and Sons
          'profile': dropdownValue ,//
          'date': selectedDate.toLocal().toString() ,//// 42
        )
            .then((value) =>(showDialogNew(value.id)))
            .catchError((error) => print("Failed to add user: $error"));
      

【讨论】:

【参考方案4】:

@Doug Stevenson 是对的,调用 doc() 方法将返回您的文档 ID。 (我使用的是 cloud_firestore 1.0.3)

要创建文档,您只需调用 doc()。例如,我想在将消息发送到 Firestore 之前获取消息 ID。

  final document = FirebaseFirestore.instance
      .collection('rooms')
      .doc(roomId)
      .collection('messages')
      .doc();

我可以打印并查看文档的 ID。

print(document.id)

要保存它而不是调用 add() 方法,我们必须使用 set()。

  await document.set(
    'id': document.id,
    'user': 'test user',
    'text': "test message",
    'timestamp': FieldValue.serverTimestamp(),
  );

【讨论】:

我们不能像dart FirebaseFirestore.instance.collection('rooms').doc(roomId).collection('messages') .doc().set( 'id': doc().id, 'user': 'test user', 'text': "test message", 'timestamp': FieldValue.serverTimestamp(), ); 这样的单一语句中实现它

以上是关于在 Dart 的 Cloud Firestore 中添加文档后如何获取文档 ID的主要内容,如果未能解决你的问题,请参考以下文章

Flutter web无法从firestore获取数据

如何在 Cloud Firestore 中使用 Stream 回调

flutter cloud-firestore MissingPluginException 异常

如何使用 Firebase Cloud Firestore 对方法进行单元测试?

Flutter Cloud Firestore 将 serverTimestamp 转换为 String

Flutter:Firebase基本查询或基本搜索代码