在本机聊天应用程序项目的上下文中,我正在使用
firebase.firestore().collection("conversations").where("members", "array-contains", {email}).onSnapshot( ... )
。
该侦听器位于我的收件箱的componentDidMount()
每次启动应用程序时,即使没有新内容,也会返回整个查询结果集。如何将此侦听器的结果限制为仅自上次从Firestore读取以来已发生的变化?我研究了redux-persist
,但是不确定如何限制onSnapshot
的结果集。
主要目标是最大程度地减少潜在的Firebase账单。如果使用onSnapshot无法完成,那么还有哪些其他选项可以维护实时功能?我知道实时数据库会收取存储费用,而不是读取/写入/删除
答案 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计费