Estoy implementando una pantalla "Mis chats". Me interesa escuchar todos los nuevos cambios en mis chats, sin descargar la colección completa.
Para ello, he decidido ordenar mis consultas por campos de fecha.
Así es como se ve un documento de sala de chat en mi sistema:
doc { ... deletedAt: null | date, lastMessage: { ..., date: date, deletedAt: null | date, }, readAt: null | date, }Tengo diferentes tipos de "eventos" que necesito escuchar:
Escuche nuevas salas de chat (una nueva sala de chat contendrá, con seguridad, un campo lastMessage.date)
Escuche las actualizaciones de chatRoom.readAt
Escuche las actualizaciones de chatRoom.deletedAt
Escuche lastMessage.deletedAt actualizaciones
Escuche las nuevas actualizaciones de lastMessage.date
Para escuchar nuevos chats, estoy haciendo:
firestore .collection("chats") .where("membersArray", "array-contains", currentUser.uid) .where("deletedAt", "==", null) .orderBy("lastMessage.date") .startAt(new Date()) .onSnapshot(...);Y, para escuchar los cambios de "readAt", después de new Date() y sin la necesidad de descargar toda la colección, estoy haciendo:
firestore .collection("chats") .where("membersArray", "array-contains", currentUser.uid) .where("deletedAt", "==", null) .orderBy("readAt") .startAt(new Date()) .onSnapshot(...);Ambos oyentes funcionan bien. Pero... como necesito detectar todos los cambios en la misma pantalla, puede haber intersecciones entre los resultados de ambos oyentes.
Esta es la única manera que se me ocurre de escuchar los diferentes tipos de eventos de mi colección y de una fecha específica, sin tener que leer todos los documentos.
¿Hay alguna forma de evitar todas estas posibles intersecciones? ¿O escuchar todos estos eventos diferentes a la vez, sin necesidad de crear diferentes oyentes o leer la colección completa?
Nota: Estoy usando querySnapshot.docChanges() para obtener cambios.
Ambas consultas parecen leer exactamente el mismo conjunto de documentos, solo que en un orden diferente. En tal caso, normalmente leería los documentos con una sola consulta y luego los reordenaría según fuera necesario en el código de mi aplicación.