javascript - 如何有条件地监听房间消息集合(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
有时会改变。
解决方案
如果我正确理解您的问题,如果您“想收听最近 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();
}
}
推荐阅读
- wordpress - WordPress 博客文章音频版本上的 Amazon polly 品牌
- javascript - onclick 函数在 innerHTML 中不起作用
- java - httpRequest.getCookies() 未获取所有 cookie
- java - 如何在java中运行xjc -nv
- c# - 启动时未创建数据库
- reactjs - 无法在 PReact 项目中导入“ag-grid-react”
- java - Spring integration MessagePublishingErrorHandler not being invoked
- hibernate - 使用 nextval 休眠保存
- java - Java 正则表达式处理带有嵌套数据的字符串对象
- javascript - angular 5 build 在 MB 中生成 main.bundle,这会在生产中产生性能问题