Firebase Firestore:离线添加数据后获取文档ID

时间:2018-04-14 09:02:06

标签: javascript firebase google-cloud-firestore offline

我将数据添加到Firestore,如下所示:

db
    .collection('foo')
    .add({foo: 'bar'})
    .then(docRef => {
      console.log('Added Foo: ', docRef.id)
      // do some stuff here with the newly created foo and it's id.
    })
    .catch(console.error)

创建文档后,我想使用新文档或特别是ID。该文档存储在具有有效ID的本地数据库中。

但是如何在创建文档后获取ID?在数据与服务器同步之前,将不会解析承诺。

2 个答案:

答案 0 :(得分:1)

您甚至可以在本地保存之前获取ID。你只需用这种方式写数据。

      // Add a new document with a generated id.
     var newCityRef = db.collection("cities").doc();
      var id = newCityRef.key;
      // later...
       newCityRef.set(data);

对于Web,默认情况下禁用脱机持久性。要启用持久性,请调用enablePersistence方法

firebase.firestore().enablePersistence()
  .then(function() {
      // Initialize Cloud Firestore through firebase
      var db = firebase.firestore();
  })
  .catch(function(err) {
      if (err.code == 'failed-precondition') {
          // Multiple tabs open, persistence can only be enabled
          // in one tab at a a time.
          // ...
      } else if (err.code == 'unimplemented') {
          // The current browser does not support all of the
          // features required to enable persistence
          // ...
      }

要检查您是从服务器还是缓存接收数据,请在快照事件中使用SnapshotMetadata上的fromCache属性。 IffromCache是​​真的,数据来自缓存,可能是陈旧的或不完整的。如果fromCache为false,则数据是完整的,并且是当前服务器上的最新更新。

默认情况下,如果仅更改了SnapshotMetadata,则不会引发任何事件。如果依赖于fromCache值,请在附加侦听处理程序时指定includeMetadataChanges listen选项。

db.collection("cities").where("state", "==", "CA")
  .onSnapshot({ includeQueryMetadataChanges: true }, function(snapshot) {
      snapshot.docChanges.forEach(function(change) {
          if (change.type === "added") {
              console.log("New city: ", change.doc.data());
          }

          var source = snapshot.metadata.fromCache ? "local cache" : "server";
          console.log("Data came from " + source);
      });
  });

因此,如果您添加新数据并且已启用离线功能,您的数据将被添加到缓存中,并且可以被侦听器监听。

});

答案 1 :(得分:0)

我遇到了这个为我完成工作的解决方法。

db
    .collection('foo')
    .where('fooCreator', '==', currentUserId)
    .onSnapshot(querySnapshot => {
      querySnapshot.docChanges.forEach(change => {
        if (change.type === 'added' && change.doc._document.hasLocalMutations) {
          const fooId = change.doc.id
          const foo = change.doc.data()
          // do something with foo and fooId
        }
      })
    })

它有效,但我不喜欢它因为:

  1. 我需要订阅所有更改
  2. 我使用change.doc._document.hasLocalMutations检查它是否是新创建的项目