firebase 为什么在使用on_snapshot时Firestore发送所有结果,而不是只发送新项目?

0md85ypi  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(154)

我正在使用Firebase的Firestore来存储和发布新事件。
在下面的代码中,我订阅了一个集合,并希望在添加新项目时得到通知(此代码在浏览器上执行)。
当我第一次连接时,我希望收到一个真正的 * 快照 *。然而,一旦我连接到Firestore并收到了一个初始快照,对于每个新项目,我只想得到更新,而不是一遍又一遍地得到整个集合!

function queryExercise(exercise){
    db.collection("exercises").where("exercise","==",exercise).onSnapshot(function(querySnapshot){
        querySnapshot.forEach(function(doc){
            var d_ = doc.data()
            console.log(d_);
            ...do somethign with d_...
        })
    })    
}

当我向集合发布一个新项目时,我的控制台充满了之前接收到的 * 所有 * 事件...换句话说,它向我发送了完整的快照,而不仅仅是增量。
是我做错了什么,还是API真的不支持增量更新?

avwztpqn

avwztpqn1#

看起来我需要在docChanges上阅读:

function queryExercise(exercise){
    db.collection("exercises").where("exercise","==",exercise).onSnapshot(function(querySnapshot){
        //              \/-----this thing
        querySnapshot.docChanges().forEach(function(change){
            var d_ = change.doc.data()
            console.log("Change type:", change.type, d_);
            ...
        });
    })    
}

https://firebase.google.com/docs/firestore/query-data/listen开始

vom3gejh

vom3gejh2#

这就是Firestore查询的工作方式。如果你不提供一个过滤器来过滤你想要的文档,你将得到这个集合中的所有文档。改变这种行为的唯一方法是在你的查询中使用where子句来提供一个过滤器。
听起来你好像已经有了一个想法,那就是在你的文档集中什么是“新”文档。你需要在你的文档集中使用一些字段来表示它。通常这是一个时间戳类型的字段,每当文档被创建或更改时,它就会被添加或修改。这将是你的where子句的一部分,它决定什么是“新”。使用这个字段作为一个过滤器来找出什么是“新”的。It“这是新的。

相关问题