达到 limit() 后 QuerySnapshot 删除数据

Posted

技术标签:

【中文标题】达到 limit() 后 QuerySnapshot 删除数据【英文标题】:QuerySnapshot removing data after limit() reached 【发布时间】:2020-05-05 08:36:14 【问题描述】:

我目前设置了一个查询快照,可以让我从我的 Firestore 实例接收实时数据:

let query = db.collection('Tasks')
.where('active', '==', 1)
.where("starts", ">", +new Date())
.where('user', '==', userId)
.orderBy('starts', 'asc').limit(25);

let observer = query.onSnapshot(async snapshot => 
                snapshot.docChanges().forEach(change => 
                    renderTask(change.doc, change.type);
                );
        , err => 
            console.trace(err);
        );

但是,当添加一个新的“任务”并超过查询中的限制值时,即当查询当前有 25 个文档被侦听时,它会调用快照侦听器,表示已删除一个文档。在哪里change.type === 'removed',但实际上,正在收听的文件没有改变。

我目前使用此方法检查用户是否实际删除了“任务”,其中active == 0 但当我超过查询中调用文档的限制时,它也会删除随机“任务”。

我尝试添加一个 if 子句来检查文档数据是否包含active = 0,但这不起作用并且文档(即使已更改为active = 0,它仍然包含active = 1 和我假设 Firestore 不会为返回更新的文档而烦恼,因为它假设它不会被使用?这并不理想,而且我还假设如果 firestore 认为文档的侦听器也会解耦文档已被删除。

如何区分实际已删除的文档(即active === 0)和由于达到查询限制阈值而被删除的文档?

非常感谢。

【问题讨论】:

【参考方案1】:

这是一个有趣的用例!没有开箱即用的解决方案。即使使用oldIndexnewIndex 属性,您也无法检测文档是真的从数据库中删除(“硬删除”)还是刚刚从查询中删除。

一种可能的解决方案是查询文档以查看它是否仍然存在,如下所示:

  let observer = query.onSnapshot(
    (snapshot) => 
      snapshot.docChanges().forEach((change) => 

        if (change.type === 'removed') 
          const docRef = db.collection('Tasks').doc(change.doc.id);

          docRef
            .get()
            .then(function (doc) 
              if (doc.exists) 
                console.log('STILL EXISTS');
                //Do something...
               else 
                console.log('HARD DELETED');
                //Do something else...
              
            )
         else 
            //.....
        
      );
    ,
    (err) => 
      console.trace(err);
    
  );

请注意,您不应在query.onSnapshot(async snapshot => ...) 中使用async,因为观察者不是async 函数。

【讨论】:

@danwillm 嗨,您有机会查看建议的答案吗?

以上是关于达到 limit() 后 QuerySnapshot 删除数据的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 限制访问速率

Docker 容器达到 Memory Limit 后的行为

PHP set_time_limit函数用法

MySQL优化之—limit

limit-进程句柄限制

增加 PHP memory_limit。啥时候会变得疯狂?