EventStore连续投影如何按部分流匹配输出到用户对应结果流
EventStore 连续投影按用户分流输出配置方法
核心问题是options中写死了固定的resultStreamName,导致所有分区计算结果输出到同一个流,无法按用户维度拆分。以下是两种符合需求的实现方案:
方案1:输出到独立的user-{username}-result结果流
fromCategory('user')会自动将user-前缀后的流名部分作为分区键(例如user-admin的分区键为admin),EventStore v5的连续投影支持在resultStreamName中使用{partition}占位符自动拼接分区值,直接修改配置即可:
options({ resultStreamName: "user-{partition}-result", $includeLinks: true, reorderEvents: false, processingLag: 500 }) fromCategory('user') .when({ $init: function() { return { logins: 0, } }, login: function(state, event) { state.logins += 1; }, }) .outputState()
注意:创建连续投影时需要开启**Emit enabled(允许发射事件)**权限,否则投影无法写入输出流。
方案2:直接在原user-{username}流写入result类型事件
如果不需要生成独立结果流,可以去掉全局resultStreamName配置,在事件处理逻辑中调用emit方法手动向对应源流写入结果事件:
options({ $includeLinks: true, reorderEvents: false, processingLag: 500 }) fromCategory('user') .when({ $init: function() { return { logins: 0, } }, login: function(state, event) { state.logins += 1; // 参数依次为:目标流名、事件类型、事件数据、元数据 emit(event.streamId, "result", state, event.metadata) }, })
补充说明
fromStreamsMatching本身仅支持连续投影,一次性投影无法持续监听匹配新增流,你当前场景用fromCategory处理固定前缀的流是性能更优的选择,无需替换方法。- 投影类型选择Continuous后,确认开启事件写入权限,上述配置即可正常持续运行,无需额外调整其他参数。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

