如何限制Firestore的onSnapshot侦听器返回的数据?

时间:2019-11-04 23:10:26

标签: firebase google-cloud-firestore

在本机聊天应用程序项目的上下文中,我正在使用 firebase.firestore().collection("conversations").where("members", "array-contains", {email}).onSnapshot( ... )。 该侦听器位于我的收件箱的componentDidMount()

每次启动应用程序时,即使没有新内容,也会返回整个查询结果集。如何将此侦听器的结果限制为仅自上次从Firestore读取以来已发生的变化?我研究了redux-persist,但是不确定如何限制onSnapshot的结果集。

主要目标是最大程度地减少潜在的Firebase账单。如果使用onSnapshot无法完成,那么还有哪些其他选项可以维护实时功能?我知道实时数据库会收取存储费用,而不是读取/写入/删除

1 个答案:

答案 0 :(得分:0)

无需迁移到Firebase的实时数据库。在最坏的情况下(具有大量数据的屏幕),可以结合使用redux-persist和此firestore查询来节省主要的firestore读取次数:

export const inboxLoadTest = (email, startAfter) => {
  return dispatch => {
    dispatch({ type: types.INBOX_LOADING });
    firebase
      .firestore()
      .collection("conversations")
      .where("members", "array-contains", email)
      .orderBy("lastMsgTime")
      .startAfter([startAfter])
      .onSnapshot(
        querySnapshot => {
          let conversations = [];
          querySnapshot.forEach(queryDocumentSnapshot => {
            const membersArr = queryDocumentSnapshot.get("members");
            let conversation = {
              id: queryDocumentSnapshot.id,
              conversant:
                membersArr[0] === email ? membersArr[1] : membersArr[0],
              lastMsgTime: queryDocumentSnapshot.get("lastMsgTime")
            };
            conversations.push(conversation);
          });
          dispatch(loadInboxSuccess(conversations));
        },
        errorObject => {
          dispatch(loadInboxError(errorObject.message));
        }
      );
  };
};

一旦加载了数据,redux-persist将保存到异步存储中,以便在重新加载应用程序时,上述侦听器仅针对存储在redux / asyncstorage中的最后一条消息之后的消息触发,而不是整个消息集合,节省结果集,从而节省Firebase计费