Typescript 使用Firestore实时快照侦听器时,arrayUnion和arrayRemove是否会触发从服务器重新加载整个阵列?

Typescript 使用Firestore实时快照侦听器时,arrayUnion和arrayRemove是否会触发从服务器重新加载整个阵列?,typescript,firebase,google-cloud-firestore,react-native-firebase,Typescript,Firebase,Google Cloud Firestore,React Native Firebase,使用Firestore、React Native、RN Firebase和TypeScript 我在考虑使用数组存储用户发布的UID后的书签的利弊 我甚至可以使用它为用户的书签页面生成一个内容列表,按最新的顺序排列,但我觉得我更愿意将带有title和ImageURL的数据复制到一个单独的集合中,以供特定用途 这是一个内容应用程序,有点类似于博客。主要用途是在主页上的帖子列表以及帖子页面中显示一个可点击的书签图标。我预计书签收藏量将达到3000件,而大多数都在100件以下。我们可以想象,当一个用户

使用Firestore、React Native、RN Firebase和TypeScript

我在考虑使用数组存储用户发布的UID后的书签的利弊

我甚至可以使用它为用户的书签页面生成一个内容列表,按最新的顺序排列,但我觉得我更愿意将带有title和ImageURL的数据复制到一个单独的集合中,以供特定用途

这是一个内容应用程序,有点类似于博客。主要用途是在主页上的帖子列表以及帖子页面中显示一个可点击的书签图标。我预计书签收藏量将达到3000件,而大多数都在100件以下。我们可以想象,当一个用户疯狂阅读时,他可以连续添加多达10个书签

我可能会像这样聆听包含数组的用户文档(或者将其分离到另一个集合中以避免用户文档膨胀):

然后我可以点击主页列表或页面中的书签图标。它将引发这样的行动:

// Atomically add a new bookmark to the "bookmarks" array field.
var arrUnion = bookmarks.update({
  bookmarks: admin.firestore.FieldValue.arrayUnion('ItemId_127892')
});
// Atomically remove a bookmark from the "bookmarks" array field.
var arrRm = bookmarks.update({
  bookmarks: admin.firestore.FieldValue.arrayRemove('ItemId_127892')
});

但是,如果用户有一个包含100或1000个项目的数组,我更愿意避免这种情况,因为每次添加书签时,他都会从数据库中重新加载完整的数组。这肯定会扼杀他的数据计划

另一点是,我需要立即在UI上看到更改。因此,我还需要侦听器缓存中的快速更新

那么,关于与缓存和服务器的数据交换,它是如何详细工作的呢

但是,如果用户有一个包含100或1000个项目的数组,我更愿意避免这种情况,因为每次添加书签时,他都会从数据库中重新加载完整的数组。这肯定会扼杀他的数据计划


不一定:如果启用了本地缓存(Android和iOS上的默认设置),第二次需要文档时,它实际上将来自本地缓存,而不是从服务器重新传输相同的数据。

非常感谢。可以肯定的是,你的意思是,如果用户更改了数组,侦听器将知道用户的缓存中已经有最新的数组,并且不会发送更新的数组?啊,我想我可能误解了:我以为你正在加载书签文档。如果是关于书签的,如果这些书签存储在单个文档中:每当文档发生更改时,都会再次从服务器读取整个文档。谢谢。如果有1000个项目数组,这不是一个好主意。。。我最好坚持收藏,即使这意味着更多的阅读,我想。。。
// Atomically add a new bookmark to the "bookmarks" array field.
var arrUnion = bookmarks.update({
  bookmarks: admin.firestore.FieldValue.arrayUnion('ItemId_127892')
});
// Atomically remove a bookmark from the "bookmarks" array field.
var arrRm = bookmarks.update({
  bookmarks: admin.firestore.FieldValue.arrayRemove('ItemId_127892')
});