Javascript 如何有条件地侦听房间消息集合中的更新(firestore)?

Javascript 如何有条件地侦听房间消息集合中的更新(firestore)?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我要收听最近50条消息的房间集合。我的意思是听每个房间的留言,但每个房间只有50条最后的留言 rooms/room1/messages/message1 /message2 /message... room2/messages/message1 /message2 /message... room... 现在

我要收听最近50条消息的房间集合。我的意思是听每个房间的留言,但每个房间只有50条最后的留言

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

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

      room...

现在,当
conditional\u var===true
时,我如何才能只听最后一条
50
rooms
消息,而当
conditional\u var===false
时,我如何不听呢。这里的
conditional\u var
将在某个时候更改。

如果我正确理解您的要求,如果您“想要侦听最近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(", "));
        });
如果您想停止侦听,因为
条件_var===false
,只需按中所示分离侦听器,如下所示:

roomsListener();
由于侦听器“可以通过调用调用onSnapshot时返回的函数来取消”,请参阅


根据您的评论更新:

如果要对多个集合执行相同的操作,只需使用,如下所示

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,您可以按照此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();
    }
} 

如果我正确理解了您的要求,如果您“想要侦听最近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(", "));
        });
如果您想停止侦听,因为
条件_var===false
,只需按中所示分离侦听器,如下所示:

roomsListener();
由于侦听器“可以通过调用调用onSnapshot时返回的函数来取消”,请参阅


根据您的评论更新:

如果要对多个集合执行相同的操作,只需使用,如下所示

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,您可以按照此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();
    }
} 

到目前为止,您尝试了什么?到目前为止,您尝试了什么?非常感谢,您的回答是正确的,但是在这里,我加入了多个房间,因此我正在侦听多个集合,而且如果我将其分离,那么如何再次侦听?您必须定义要侦听的集合的名称pass to CollectionGroup。你的问题不清楚你需要听哪些确切的收藏。如果集合具有不同的名称,您将无法使用CollectionGroup。谢谢,集合名称与
messages
相同,但每个集合都位于不同的房间下,如
rooms/room1/messages/message1、rooms/room2/messages/message1、rooms/room3/messages/message1
应该可以工作。只要试着理解它到底是如何工作的。文档也是一个需要仔细阅读的元素:@Muhammad如果答案解决了您的问题,您也可以接受它,请参阅。谢谢非常感谢您,您的回答是正确的,但这里我加入了多个房间,因此我正在收听多个收藏,而且如果我将其分离,那么如何再次收听?您必须定义要收听的收藏的名称pass to CollectionGroup。你的问题不清楚你需要听哪些确切的收藏。如果集合具有不同的名称,您将无法使用CollectionGroup。谢谢,集合名称与
messages
相同,但每个集合都位于不同的房间下,如
rooms/room1/messages/message1、rooms/room2/messages/message1、rooms/room3/messages/message1
应该可以工作。只要试着理解它到底是如何工作的。文档也是一个需要仔细阅读的元素:@Muhammad如果答案解决了您的问题,您也可以接受它,请参阅。谢谢