首页 > 解决方案 > 如何有条件地监听房间消息集合(firestore)中的更新?

问题描述

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

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

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

      room...

现在我怎么能只听最后50 rooms的消息,conditional_var===true而不是什么时候听conditional_var===false。这里conditional_var有时会改变。

标签: javascriptfirebasegoogle-cloud-firestore

解决方案


如果我正确理解您的问题,如果您“想收听最近 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


根据您的评论更新:

如果您想对多个集合执行相同操作,只需使用Collection Group 查询,如下所示

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(", "));
        });

请注意,您需要为 Collection Group 查询创建特定索引。正如这篇博客文章中所解释的,第一次触发监听器“客户端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();
    }
} 

推荐阅读