Node.js 我应该如何使用MongoDB changeStreams处理删除事件?
TL;DR-我如何改进对带有changeStreams的删除事件的处理,并确保它们只发送给相关用户? 目前,我正在使用MongoDBNode.js 我应该如何使用MongoDB changeStreams处理删除事件?,node.js,reactjs,mongodb,mongodb-atlas,Node.js,Reactjs,Mongodb,Mongodb Atlas,TL;DR-我如何改进对带有changeStreams的删除事件的处理,并确保它们只发送给相关用户? 目前,我正在使用MongoDBchangeStreams向我的React应用程序推送实时更新。虽然插入和更新操作进展顺利,但检测用户域特有的删除事件有点麻烦,我正在寻找改进当前解决方案或创建新解决方案的方法,为每个连接到应用程序的用户打开更改流 当前设置:所有集合,独立于用户 我当前的部署方法运行良好,我相信它是可伸缩的。一旦后端服务器启动,它将初始化所有需要监视的模型上的changeStrea
changeStream
s向我的React应用程序推送实时更新。虽然插入和更新操作进展顺利,但检测用户域特有的删除事件有点麻烦,我正在寻找改进当前解决方案或创建新解决方案的方法,为每个连接到应用程序的用户打开更改流
当前设置:所有集合,独立于用户
我当前的部署方法运行良好,我相信它是可伸缩的。一旦后端服务器启动,它将初始化所有需要监视的模型上的changeStream
s。我的数据体系结构由用户的clientID
和affiliateID
作为参考ID(clientID!=affiliateID
,两个独立的ID)分开。
MongoDB系列: 我将changeStreams选项设置为
updateLookup
,当它在一个监视的模型中检测到更改事件时,它会将changeStream
中的整个文档作为data.fullDocument
发送。这很有用,因为我可以获取更改文档的clientID
和affiliateID
,并通过socket.io将更改仅发送给相关用户。但是,当监视的集合中发生删除事件时,此方法是次优的,因为updateLookup
无法将完整文档返回到更改流,从而阻止我获取clientID
和affiliateID
并将更改仅发送给受影响的用户。
Delete events仅返回
数据。documentKey
来自changeStream
s的以下结构的对象:
documentKey:{
_id:ObjectID,//已删除文档的id
shardKey1:…,//documentKey仅包含分片MongoDB集群的分片密钥
shardKey2:…,//否则,documentKey只包含_id
//...
沙德金:。。。
}
虽然我确实打算对集群进行分片,但基于
clientID
和affiliateID
对集群进行分片是一个糟糕的选择,因为它会创建大量的分片。此外,尽管很少添加新的客户和分支机构,但shard密钥将单调增加(如果这种思想是错误的,请在这里纠正我)
当前的解决方法是将删除事件和文档ID发送给所有连接的用户,而不管客户和分支机构如何,并在存在具有匹配ID的文档时搜索其信息。这带来了一些问题:
- 集群分片后,文档的
字段不再保证唯一。因此,如果我继续使用当前的解决方法,则当非关联用户B删除某些数据时,可能会从应用程序中的用户a的屏幕(而不是MongoDB)中删除用户a的数据\u id
- 一旦集群被切分,切分键仍然不会为
或使用socket.io将这些事件发送给相关用户的方法提供任何价值。changeStream
changeStream
,这样我就可以在API函数调用中传递clientID
和affiliateID
。但是,changeStream
s只能在整个数据库或集合上打开,而不仅仅是在满足某些条件(即匹配参考ID)的数据库或集合上打开。其次,我认为这会在后端产生太多的性能成本,并且不能很好地与其他附属公司和客户进行扩展
Model A (watched)
Model B (watched)
Model C (watched)
Clients
Affiliates
Users
- User A
* clientID
* affiliateID