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

时间:2019-09-30 07:38:47

标签: javascript firebase google-cloud-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有时会更改。

1 个答案:

答案 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();
    }
}