我想听最近50条消息的房间集合。我的意思是听每个房间的消息,但每个房间只听50条最后一条消息。
rooms/room1/messages/message1
/message2
/message...
room2/messages/message1
/message2
/message...
room...
现在如何在50
时仅收听最近的rooms
conditional_var===true
条消息,而在conditional_var===false
时不收听。这里的conditional_var
有时会更改。
答案 0 :(得分:2)
如果我正确理解您的要求,如果您“想收听最近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
而停止收听,只需按照documentation所示分离监听器,如下所示:
roomsListener();
由于侦听器“可以通过调用onSnapshot调用时返回的函数来取消”,请参见https://firebase.google.com/docs/reference/js/firebase.firestore.Query#on-snapshot。
根据您的评论进行更新:
如果要对多个集合执行相同的操作,只需使用Collection Group query,如下所示
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(", "));
});
请注意,您需要为集合组查询创建一个特定的索引。如本blog article中所述,第一次触发侦听器时,“客户端SDK会给您一条错误消息,因为尚未创建集合组索引。但是与此错误消息一起,还有一个您可以用来修复它的网址”。
要重新激活(即重新连接)侦听器,只需在查询中再次调用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();
}
}