达到 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】:这是一个有趣的用例!没有开箱即用的解决方案。即使使用oldIndex
和newIndex
属性,您也无法检测文档是真的从数据库中删除(“硬删除”)还是刚刚从查询中删除。
一种可能的解决方案是查询文档以查看它是否仍然存在,如下所示:
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 删除数据的主要内容,如果未能解决你的问题,请参考以下文章