Если я правильно понимаю, что вы спрашиваете, если вы «хотите прослушать набор комнат из последних 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();
}
}