Javascript 只收听云firestore集合中的添加内容?
我注意到,当我尝试在firestore中的集合上使用实时侦听器时,每次向集合添加新文档时,逻辑都将重新运行,我将下载集合中已经存在的所有内容 现在:Javascript 只收听云firestore集合中的添加内容?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我注意到,当我尝试在firestore中的集合上使用实时侦听器时,每次向集合添加新文档时,逻辑都将重新运行,我将下载集合中已经存在的所有内容 现在: firebase.firestore().collection("Tweets").onSnapshot(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log("snapshot added ", doc) })
firebase.firestore().collection("Tweets").onSnapshot(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log("snapshot added ", doc)
});
});
是否有办法只跟踪收藏中的新增内容?我想我可以在设备端完成,但是没有必要传输我已经查询过的所有附加数据
该日志的输出将打印出集合中的每一条“tweet”,而不管只添加了一条
例:
初始查询
-推特1
-推特2
-推特3
新增Tweet,新增Tweet 4
输出:
推特1
推特2
推特3
推特4
如果这有意义的话,那么,
onSnapshot
似乎只用于侦听整个文档,这意味着它将返回您正在侦听的文档中的所有字段。因此,您不能仅检索已更改的字段。
但你可以根据不同类型的变化做不同的事情:
xxxx.onSnapshot(function(querySnapshot){
querySnapshot.docChanges.forEach(function(change){
if(change.type=="added"){//first time it will be triggered
}else if(change.type == "modified"){//modified
}else if(change.type == "removed"){//removed
}
})
})
希望这有帮助当您在集合上使用时,您并不是在每次调用时都下载整个集合。文档将被缓存,并在集合再次更改时重新使用
对于导致调用回调的每个更改,您可以通过检查快照中的更改来找出自第一次调用以来新看到的文档。如何做到这一点的一个例子是。有了查询快照,您可以使用此逻辑确定哪些文档是新文档:
snapshot.docChanges.forEach(function(change) {
if (change.type === "added") {
// change.doc here is new a new document
}
});
您可以获取导致此回调的新文档
for change in changes:
if change.type.name == 'ADDED':
print(f'New document: {change.document.id}')
文档是缓存的,因此没有完全下载。但如果完整数据大于缓存大小,则可能需要下载。最好的策略是启用磁盘缓存存储,然后使用limitToLast(1) 在这个键中,1可能是tweet id 这将利用自动单个属性索引,并且只获取最后一条记录。如果启用了持久性,则此提取将从缓存中进行
上面的多个答案讨论了如何判断这些数据是新的还是过时的。我们需要更多信息。这是什么,DataRef?收藏参考?询问?请具体说明。另外,您正在使用的数据库的内容是什么?这些特定内容的日志输出是什么?对不起,我刚刚做了一个编辑,有没有办法只听一次集合?不是onSnapshot的东西?是的,有get()。“第一个查询快照包含与查询匹配的所有现有文档的添加事件。”,如何忽略第一个快照而只侦听实际添加的文档?@BlackCoffee您不能。相反,您应该了解如何仅查询所需的文档。通常,这涉及添加一个可以用作筛选器的字段。或者,或者你必须根据你定义的标准,提出你自己关于什么是“新的”的一套假设。我找到了一种忽略第一个快照的方法,一旦添加了一个新文档,回调函数就会收到另一个完整的文档补丁(不仅仅是添加的),并且所有的文档都是“添加”类型!问题指定侦听集合,但此答案指定侦听文档
firebase.firestore().collection("Tweets")
.orderBy("key1")
.limitToLast(1)
.onSnapshot(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log("snapshot added ", doc)
});
});