是否可以不是通过StreamId搜索流,而是通过其他Stream属性搜索?例如,如果每个流在Headers中都有CustomerId,我想用特定的CustomerId搜索所有流。
答案 0 :(得分:7)
事件存储旨在支持仅由实体的密钥进行检索。为了支持其他属性的检索,数据以最终一致的,非规范化的方式被索引,专门针对每个用例并在单独的位置。因此,事件存储仅存储事件并支持查询任何类型的索引投影。它们有点像关系数据库中的持久视图,但它们可以存储在一个简单的键值存储中。事件存储和投影商店共同构成CQRS + Event Sourcing架构背后的基础架构的一部分。请查看here以及该博客的其余部分,了解有关此主题的更多信息。
答案 1 :(得分:2)
您可能正在尝试错误地使用事件存储。事件存储仅用于保存和读取已提交事件的流,以便重建事件源聚合。实现提供用于方便地实现基础结构关注的头部,例如请求/响应相关ID,审计,安全性等。如果您发现自己将业务属性放在那里 - 比如客户ID - 那么您可能需要建立一个@eulerfx建议的读取模型。
如果它是您正在寻找的ID,那么您应该考虑将CustomerID作为该客户的实际事件流ID。通过其ID加载特定客户正是您期望事件存储做的事情。
答案 2 :(得分:2)
EventStore现在有预测可以做你想要的。有关详细信息,请参阅此博客
http://geteventstore.com/blog/20130227/projections-6-an-indexing-use-case/
答案 3 :(得分:0)
虽然它可能不是查找内容的最有效方法,但如果您确实需要一个流列表以便搜索它们或找到特定的一个,那么就会有一个$ streams系统投影,但它需要先启用可以使用像powershell这样的东西来使用它:
uri$ = http://${EventStoreIP}:${EventStoreHttpPort}/projection/${projection}/command/enable
$result = Invoke-WebRequest -Method Post -Uri $uri -UseBasicParsing -TimeoutSec 90 -Headers @{
Authorization = Get-BasicAuthCredentials
}
其中$ projection是' $ streams'。另请参阅可以相同方式启用的其他系统投影,这些投影可以提供您需要的更精确的内容,这些内容在此处记录:https://eventstore.org/docs/projections/system-projections/