如何编写新文档的ID [firebase.firestore()。onSnapshot()]

时间:2020-05-27 01:29:52

标签: javascript firebase google-cloud-firestore

我使用Firebase Hosting,并希望实现此Web应用程序。 (我使用Windows 10,Linux的Windows子系统,Debian 10.3和Google Chrome浏览器。)

  1. 在Cloud Functions(index.js)中,我在Firestore的script集合中创建了一个新文档。

    admin.firestore().collection('script').add({
      text: transcription,
      timestamp: admin.firestore.FieldValue.serverTimestamp()
    });
    
  2. 在客户端(main.js)中,我使用onSnapshot监听Firestore中的更改。但是,我不知道如何console.log仅添加新文档。

    如果我知道文档的ID(例如,G1pvc5LNojV4X7vfvpkI),则可以在main.js中执行此操作。但是,我不知道如何写新文档的ID。

    firebase.firestore().collection('script').doc('G1pvc5LNojV4X7vfvpkI')
        .onSnapshot(function(doc) {
          console.log("Current data: ", doc.data());
        });
    

    您能告诉我如何写新文档的ID吗?

3 个答案:

答案 0 :(得分:1)

未经过滤的集合查询将始终在第一个回调中返回集合中的所有文档。如果不需要所有文档,则仅需要过滤所需的文档。如果您不打算使用过滤器,那么快照侦听器将无法执行您的操作。

由于要在每个文档中写入时间戳,因此可以将其用作仅获取最新文档的过滤器,但这不一定能保证按您希望的方式工作。如果客户的日期有误,那么您可能找不到想要的东西。

如果要将集合中的新文档通知特定的客户,则可以使用FCM发送消息,但这将需要更多的工作。

答案 1 :(得分:1)

我认为您正在寻找:

firebase.firestore().collection('script').orderBy("timestamp", "desc").limit(1)
    .onSnapshot(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
        console.log("Current data: ", doc.data());
      });
    });

如果只想在附加侦听器后获取新文档,则可以使用以下方法将查询设置为仅在“ now”之后返回结果:

firebase.firestore().collection('script').orderBy("timestamp", "desc").startAt(new Date()).limit(1)
    .onSnapshot(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
        console.log("Current data: ", doc.data());
      });
    });

答案 2 :(得分:0)

快照具有键属性。您应该可以通过doc.key

来获取密钥