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

问题描述

使用Firestore,React Native,RN Firebase,TypeScript。

我正在考虑使用数组存储来自用户的Uid的书签的利弊。

我什至可以使用它为用户的书签页面生成内容列表,按最新顺序排序,但是我觉得我宁愿将具有title和ImageURL的数据复制到该特定用途的单独集合中。 / em>

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

我可能会像这样收听包含数组的用户文档(或将其分成另一个集合,以避免使用户文档膨胀):

import React,{ useEffect } from 'react';
import firestore from '@react-native-firebase/firestore';

function User({ userId }) {
  useEffect(() => {
    const subscriber = firestore()
      .collection('Users')
      .doc(userId)
      .onSnapshot(documentSnapshot => {
        console.log('User data: ',documentSnapshot.data());
      });

    // Stop listening for updates when no longer required
    return () => subscriber();
  },[userId]);
}

然后,我可以单击主页列表或页面中的书签图标。它将触发这样的动作:

// 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上的默认设置),则第二次需要文档时,它实际上将来自其本地缓存,而不是从服务器重新传输相同的数据。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...