我注意到,当我尝试在firestore中的Collection上使用实时监听器时,每次将新Document添加到集合中时,逻辑将重新运行,我将下载集合中已有的所有内容
现在:
#include "myform.h"
void MainWindow::on_pushButton_clicked()
{
MyForm *dialog = new MyForm();
dialog->show();
}
有没有办法只追踪到该系列的ADDITIONS?我想我可以做那个设备端,但是没有必要转移我已经查询过的所有额外数据..
该日志的输出将打印出集合中的每个“推文”,无论是否只添加了一个
EX: 初始查询
-Tweet 1
-Tweet 2
-Tweet 3
New Tweet,Tweet 4已添加
输出:
鸣叫1
Tweet 2
Tweet 3
鸣叫4
如果这是有道理的
答案 0 :(得分:5)
在集合上使用onSnapshot()时,实际上并没有在每次调用时下载整个集合。文档被缓存,并在集合再次更改时重用。
对于导致调用回调的每个更改,您可以通过检查快照中的更改来找出自第一次调用以来新显示的文档。如何执行此操作的示例是in the documentation。使用查询快照,您可以使用此逻辑来确定哪些文档是新文档:
snapshot.docChanges.forEach(function(change) {
if (change.type === "added") {
// change.doc here is new a new document
}
});
答案 1 :(得分:1)
似乎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
}
})
})
希望这有帮助
答案 2 :(得分:0)
您可以获取导致此回调的新文档
for change in changes:
if change.type.name == 'ADDED':
print(f'New document: {change.document.id}')
答案 3 :(得分:0)
文档已缓存,因此未完全下载。但如果完整数据大于缓存大小,则可能会重新下载。最好的策略是启用缓存存储到磁盘,然后使用 limitToLast(1)。
firebase.firestore().collection("Tweets")
.orderBy("key1")
.limitToLast(1)
.onSnapshot(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log("snapshot added ", doc)
});
});
在这个 key1 中可能是推文 ID。
这将利用自动单个属性索引,并且只会获取最后一条记录。如果启用持久性,则此提取将从缓存中进行。
上面的多个答案已经讨论了如何判断这些数据是新的还是陈旧的。