更改流未在MongoDB中使用特定管道触发

ruyhziif  于 2023-05-28  发布在  Go
关注(0)|答案(1)|浏览(170)

我正在做一个项目,我需要观察用户管理的组的MongoDB文档中的变化。我正在使用MongoDB中的变更流来实现这一点。但是,我遇到了一个问题,当我使用特定的管道来匹配基于经理的用户ID的文档时,变更流不会被触发。我想知道为什么变更流没有按预期工作,以及如何修复它。

public ManagerGroupWatch = (user_id: string) => {
      const pipeline = [{ $match: { 'manager.user_id': user_id } }];
      const changeStream = GroupModel.watch(pipeline);
      changeStream.on('change', (change) => {
          // Handle the change event
          console.log('Change:', change);
       });

    }

文档示例:

_id: 'TEST'
name: "test"
entry_coins: 100
uuid: "**********"
group_created: 2023-05-15T11:41:39.369+00:00
participants: Array
tournament: Object
manager: {user_id:'some_id', name:'test'}
current_match: Object
total_amount_win: 300
picture: ""
slug: "test-test"
history_matches: Array
requestsJoins: Array
__v: 4

我面临的问题是,当我使用管道根据经理的用户ID匹配文档时,变更流没有被触发。但是,如果我删除管道并查看所有文档,变更流就可以正常工作。我已经验证了文档确实具有正确的经理用户ID。我不确定为什么变更流不能与特定的管道一起工作。
我将感谢任何关于如何解决这个问题的见解或建议。感谢您的评分

ndh0cuux

ndh0cuux1#

要解决使用特定管道根据经理的用户ID匹配文档时未触发更改流的问题,可以对代码进行以下更改:

public ManagerGroupWatch = (user_id: string) => {
  const pipeline = [{ $match: { 'fullDocument.manager.user_id': user_id } }];
  const changeStream = GroupModel.watch(pipeline, { fullDocument: 'updateLookup' });
  changeStream.on('change', (change) => {
    // Handle the change event
    console.log('Change:', change);
  });
}

关键的变化是在管道中,您需要匹配fullDocument. manage.user_id字段,而不仅仅是manage.user_id。这确保变更流在匹配过程中考虑完整的文档。
另外,您需要传递**{ fullDocument:'updateLookup' }**作为watch方法的第二个参数。这个配置选项告诉变更流返回更新文档的最新版本,而不仅仅是字段的增量。
有了这些更改,更改流现在应该基于管道匹配管理员的用户ID正确触发。

相关问题