从Realtime数据库迁移后,使用Firestore进行实时更新

时间:2018-09-08 11:21:44

标签: javascript firebase google-cloud-firestore

我目前正在将我的应用程序从Realtimedatabase迁移到Firestore。我遇到了需要您提出建议的问题。

该应用程序用于能源监控系统,其中从客户端设备逐分钟传递数据。然后由位于不同位置的Web应用程序读取。客户端使用Python,服务器使用Web应用程序。

我的数据结构如下

Energmeter1
    --->PowerData
       -->Auto-ID1
           -->Volt:315
           -->timeint: 365789    
       -->Auto-ID2
           -->Volt:318
           -->timeint: 365790

现在在Web应用程序的接收端,我有一个图表应用程序,该应用程序会在添加每个数据时进行更新。

借助Firebase Realtime,我使用了下面的代码,这非常简单,无缝

var fb = firebase.database().ref(url);
fb.endAt().limitToLast(3).on('child_added', function(data)

每次创建新条目时,我都会使用它接收并在实时仪表板上显示它,但是使用Firestore似乎是不可能的

feeder1
.orderBy("timeint") 
.onSnapshot(function(doc)

上面的函数检索查询中的所有记录,而不仅仅是最近添加的记录。

我的问题,

  1. 我的方法正确吗?
  2. 我们可以用Firestore实现类似的功能吗?还是根本不可能?

如果您需要更多详细信息,请告诉我,我很乐意提供

谢谢

1 个答案:

答案 0 :(得分:1)

快照包含与查询匹配的所有文档。但是,通过检查docChanges属性,您可以轻松地仅找到新添加的内容。来自Firestore documentation on checking changes

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

所以在您的情况下:

feeder1
  .orderBy("timeint") 
  .onSnapshot(function(snapshot) {
    snapshot.docChanges.forEach(function(change) {
      if (change.type === "added") {
        // Do whatever you'd do on on('child_added' on the Realtime Database
      }
    });
  });