Cloud Firestore 中 get() 和 onSnapshot() 的区别

Posted

技术标签:

【中文标题】Cloud Firestore 中 get() 和 onSnapshot() 的区别【英文标题】:Difference between get() and onSnapshot() in Cloud Firestore 【发布时间】:2019-06-26 01:17:37 【问题描述】:

我正在从 Firebase 的 Cloud Firestore 读取一些数据,但我已经看到了几种方法。我看到的示例使用 get 和 onSnapshot 函数,如下所示:

db.collection("cities").doc("SF")
 .onSnapshot(doc => 
      console.log(doc.data());
 );

或者这个

var docRef = db.collection("cities").doc("SF");

docRef.get().then(doc => 
    if (doc.exists) 
         console.log("Document data:", doc.data());
     else 
         console.log("No such document!");
    
).catch(function(error) 
   console.log("Error getting document:", error);
        );

它们之间有什么区别吗?

【问题讨论】:

【参考方案1】:

如doc中所述:

两种方法可以检索存储在 Cloud Firestore 中的数据。任何一个 这些方法中的一些可以用于文档、文档集合、 或查询结果:

调用方法获取数据。 设置侦听器以接收数据更改事件。

当您设置监听器时,Cloud Firestore 会向您的监听器发送一个 数据的初始快照,然后每次创建另一个快照 文档更改。

当您使用get() 时,您“仅检索单个文档的内容”一次。这是一种“一劳永逸”:如果(后端)Firestore 数据库中的文档发生更改,您将需要再次调用 get() 以查看更改。

相反,如果您使用onSnapshot() 方法,您不断地收听文档,如doc 中所述:

您可以使用onSnapshot() 方法收听文档。一个初始 使用您提供的回调调用创建文档快照 立即使用单个文档的当前内容。然后, 每次内容更改,另一个调用会更新文档 快照。

如这些文档中所述,这两种方法适用于一个文档或一组文档(包括 query)。

【讨论】:

onSnapshot 比 get 贵吗? @KickButtowski 是的。 @FarisMX 见***.com/a/51431655/3371862

以上是关于Cloud Firestore 中 get() 和 onSnapshot() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore:查询找不到文档但文档存在

使用规则禁用 Firebase Cloud Firestore 中的查询集合

我们会为仅从缓存中读取(Cloud FireStore)支付(成本)吗? [复制]

Cloud Firestore 集合查询不起作用

如何将 Cloud Firestore 中的数据分配给 Android 的全局变量 [重复]

使用实时更新时如何检查 Cloud Firestore 文档是不是存在