Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我应该如何使用MongoDB changeStreams处理删除事件?_Node.js_Reactjs_Mongodb_Mongodb Atlas - Fatal编程技术网

Node.js 我应该如何使用MongoDB changeStreams处理删除事件?

Node.js 我应该如何使用MongoDB changeStreams处理删除事件?,node.js,reactjs,mongodb,mongodb-atlas,Node.js,Reactjs,Mongodb,Mongodb Atlas,TL;DR-我如何改进对带有changeStreams的删除事件的处理,并确保它们只发送给相关用户? 目前,我正在使用MongoDBchangeStreams向我的React应用程序推送实时更新。虽然插入和更新操作进展顺利,但检测用户域特有的删除事件有点麻烦,我正在寻找改进当前解决方案或创建新解决方案的方法,为每个连接到应用程序的用户打开更改流 当前设置:所有集合,独立于用户 我当前的部署方法运行良好,我相信它是可伸缩的。一旦后端服务器启动,它将初始化所有需要监视的模型上的changeStrea

TL;DR-我如何改进对带有changeStreams的删除事件的处理,并确保它们只发送给相关用户?

目前,我正在使用MongoDB
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的文档时搜索其信息。这带来了一些问题:

  • 集群分片后,文档的
    \u id
    字段不再保证唯一。因此,如果我继续使用当前的解决方法,则当非关联用户B删除某些数据时,可能会从应用程序中的用户a的屏幕(而不是MongoDB)中删除用户a的数据
  • 一旦集群被切分,切分键仍然不会为
    changeStream
    或使用socket.io将这些事件发送给相关用户的方法提供任何价值。

如何改进对带有changeStreams的删除事件的处理,并确保它们只发送给相关用户? 我最初的理论是为每个连接的用户在每个集合上打开一个
changeStream
,这样我就可以在API函数调用中传递
clientID
affiliateID
。但是,
changeStream
s只能在整个数据库或集合上打开,而不仅仅是在满足某些条件(即匹配参考ID)的数据库或集合上打开。其次,我认为这会在后端产生太多的性能成本,并且不能很好地与其他附属公司和客户进行扩展

Model A (watched)
Model B (watched)
Model C (watched)
Clients
Affiliates
Users
    - User A
        * clientID
        * affiliateID