Как выслушать условно обновления в коллекции комнатных сообщений (firestore)? - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу прослушать коллекцию номеров последних 50 сообщений. Я имею в виду прослушивать сообщения каждой комнаты, но только 50 последних сообщений в каждой комнате.

rooms/room1/messages/message1
                    /message2
                    /message...

      room2/messages/message1
                    /message2
                    /message...

      room...

Теперь Как я могу прослушивать только последние 50 rooms сообщения, когда conditional_var===true, и не слушать, когдаconditional_var===false. Здесь conditional_var будет когда-нибудь изменен.

1 Ответ

2 голосов
/ 30 сентября 2019

Если я правильно понимаю, что вы спрашиваете, если вы «хотите прослушать набор комнат из последних 50 сообщений», вам следует настроить прослушиватель на запрос, который сортирует записи по времени создания, в порядке убывания и ограничивает их. на 50.

Что-то вроде следующего:

var roomsListener = db.collection("rooms/room1/messages").orderBy("creationDate", "desc").limit(50)
        .onSnapshot(function(querySnapshot) {
            var docs = [];
            querySnapshot.forEach(function(doc) {
                docs.push(doc.data().anyField);
            });
            console.log("Current values: ", docs.join(", "));
        });

Если вы хотите прекратить прослушивание из-за conditional_var===false, просто отсоедините слушателя, как показано в документации ,и следующим образом:

roomsListener();

Поскольку слушатель "можно отменить, вызвав функцию, возвращаемую при вызове onSnapshot", см. https://firebase.google.com/docs/reference/js/firebase.firestore.Query#on-snapshot.


Обновлениепосле вашего комментария:

Если вы хотите сделать то же самое, но для нескольких коллекций, просто используйте запрос Group Collection , как указано ниже

var roomsListener = db.collectionGroup("messages").orderBy("creationDate", "desc").limit(50)
        .onSnapshot(function(querySnapshot) {
            var docs = [];
            querySnapshot.forEach(function(doc) {
                docs.push(doc.data().anyField);
            });
            console.log("Current values: ", docs.join(", "));
        });

Примечаниечто вам нужно создать конкретный индекс для запроса группы сбора. Как объясняется в этой статье блога , при первом запуске слушателя "клиентский SDK выдаст сообщение об ошибке, поскольку индекс группы сбора еще не создан. Но вместе с этим сообщением об ошибке"есть URL, по которому вы можете перейти, чтобы исправить это ".


Чтобы повторно активировать (т. Е. Повторно присоединить) слушателя, просто вызовите onSnapshot для запроса.

Вот очень простой код JavaScript с двумя функциями, которые будутпо очереди присоединяйте или отсоединяйте слушателя. Скорее всего, вам следует сделать этот код более надежным, но он показывает, как вы можете это сделать.

var listener = null;

function attachListener() {
    listener = db.collectionGroup("messages").orderBy("creationDate", "desc").limit(50)
        .onSnapshot(function(querySnapshot) {
            var docs = [];
            querySnapshot.forEach(function(doc) {
                docs.push(doc.data().anyField);
            });
            console.log("Current values: ", docs.join(", "));
        });
}


function detachListener() {
    if (listener != null) {
        listener();
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...