如何在部分文档可能已删除时成功批量提交?及批量同步源项计数器问题
问题2:如何批量同步源项与子项的likes计数器?
看你给出的数据结构,源项没有sourceId,子项通过sourceId关联到源项。要同步它们的likes值,有几种不同的方案,适合不同场景:
方案1:实时同步(修改源项时立即更新子项)
这是最直接的方式,当你修改源项的likes时,立刻同步所有关联的子项:
- 先拿到源项更新后的
likes值,比如newLikes; - 批量找到所有
sourceId等于该源项ID的子项,把它们的likes设为newLikes。
举个JS里操作对象的例子:
// 假设已经修改了源项id1的likes值 const sourceItem = items.id1; if (sourceItem) { const newLikes = sourceItem.likes; // 遍历所有子项同步 Object.values(items).forEach(item => { if (item.sourceId === 'id1') { item.likes = newLikes; } }); }
如果是数据库操作的话,一条SQL就能搞定:
UPDATE items SET likes = ? WHERE sourceId = ?;
方案2:延迟批量同步(适合高并发场景)
如果源项的likes修改非常频繁,实时同步可能会有性能压力,这时候可以用队列+定时任务的方式:
- 每次修改源项时,把源项ID加入一个待同步队列;
- 用定时任务(比如每秒跑一次)批量处理队列里的ID,一次性同步所有对应子项的
likes; - 可以给每个源项加个
updateTime字段,同步时只处理比子项updateTime更新的源项数据,避免旧更新覆盖新值。
方案3:按需计算(避免存储重复数据)
其实还有个更省心的办法——别在子项里存likes了,每次需要子项的likes时,直接去对应的源项取:
function getLikes(item) { // 如果是子项,就取源项的likes,兜底用自身的(防止源项被删) return item.sourceId ? items[item.sourceId]?.likes || item.likes : item.likes; }
这样完全不用做同步操作,节省存储和同步的开销,适合读取频率不是极高的场景。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

