我正在使用ddd
和spring
使用mongoDB
。
既然MongoDB
是一个DocumentDB
并且没有模式验证,那么AggregateRoot
和存储在MongoDB中的Document类是两个不同的类,Repository
在将数据读写到数据库
时在这两个类之间转换内容。
由于根实体类与存储到DB的类不同,所以Spring不会触发AggregateRoot
的DomainEvents
。
>
在将数据存储到数据库后,有没有一种方法可以从存储库中触发根实体的事件?(可能通过显式调用)
因为MongoDB和聚合是1:1匹配。那么,这是否意味着我们通常不应该创建两个不同的类,一个是aggregateRoot
,另一个是Document类,用于在MongoDB中存储聚合根?难道我们不需要在聚合的基础上添加@Document注释吗?
过了一会儿,我想出了解决办法,从投票结果来看,我相信其他人也面临着同样的问题,下面是解决办法:
回答:是的,我们可以。在Springboot
中,我们可以使用/Autowire
ApplicationEventPublisher
接口,然后调用PublishEvent(event)
方法。
如果要为Db集合和聚合创建一个单独的类,则需要在聚合中公开DomainEvents
和用于ClearingDomainEvents
的方法,因为AbstractAggregateRoot
将这些方法作为protected
。下面是在创建时引发事件的示例:
public class MyAggregateRootClass extends AbstractAggregateRoot<MyAggregateRootClass>
{
public MyAggregateRootClass(String property1, String property2) {
// set the fields here
registerEvent(new MyAggregateRootCreated(someArgs));
}
public Collection<Object> getDomainEvents() {
return super.domainEvents();
}
public void clearDomainEvents() {
super.clearDomainEvents();
}
}
存储库代码如下所示:
@Repository
@RequiredArgsConstructor // using lombok here, you can create a constructor if you want
public class MyAggregateRepository {
private final ApplicationEventPublisher eventPublisher;
private final AggregateMongoRepository repository;
public void save(MyAggregateRootClass aggToSave) {
AggregateDao convertedAgg = new AggregateDao(aggToSave);
repository.save(convertedAgg);
// raise all the domain events
for (Object event : aggToSave.getDomainEvents())
eventPublisher.publishEvent(event);
// clear them since all events have been raised
aggToSave.clearDomainEvents();
}
}
回答:不,这并不意味着。DDD
的目标是将基础结构
与域
分开,并使域
不知道所有基础结构代码。如果两者相同,则以下是影响:
聚合类
上使用@document
批注,则在转换框架或用SQL
交换MongoDB
时,将更改域
。
- 以后,如果数据库架构需要更改,则必须同时更改聚合类或设置适配器类。
- 因为域只应在业务需求发生变化而不是因为
基础结构依赖项
而发生变化,所以将基础结构注释
悄悄插入到聚合库
中不是最佳方法
- 如果您完全确定永远不会切换DBs或更改框架。
- 您有一个简单的域模型,不需要将
聚合
的实体
存储在单独的集合中,而且这些实体
不可能成长为自己的聚合
最后要看情况而定。请随意发表评论,我会尽我所能回答所有的评论,在堆栈上相当活跃。
我在GET api中有多个查询参数(如姓名、年龄、性别、位置等…n个数字)。现在我需要使用这些查询值来查询我的mongo数据库。现在用户可以发送从0到n的查询参数。 我正在尝试使用类似的东西 或者 但问题是,考虑到用户可以发送的所有排列和组合,我将不得不编写多个查询。有没有更好的方法来做到这一点?
本文向大家介绍SpringBoot实现的Mongodb管理工具使用解析,包括了SpringBoot实现的Mongodb管理工具使用解析的使用技巧和注意事项,需要的朋友参考一下 项目介绍 Mongodb网页管理工具,基于Spring Boot2.0,前端采用layerUI实现。 源于线上环境部署mongodb时屏蔽了外网访问mongodb,所以使用不了mongochef这样方便的远程连接工具,便Mo
主要内容:额外开销,RAM 使用,查询限制,索引键限制,插入超过索引键限制的文档,最大范围本节我们来介绍以下使用索引时的一些限制和注意事项。 额外开销 每个索引都会占用一些空间,并且在每次执行插入、更新和删除等操作时也需要对索引进行操作,导致额外的开销。因此,如果您很少将某个集合用于读取操作,最好不要在集合中使用索引。 RAM 使用 由于索引存储在 RAM(内存)中,因此应确保索引的总大小不超过 RAM 的限制。如果总大小大于 RAM 的大小,那么 MongoDB 将删除一些索引,这就
我正在尝试使用@Query注释从Spring Boot MongoRepository执行一个复杂的GeoQuery。以下是我的文档: 我需要我的查询执行以下任务: null
问题内容: 我正在尝试使用Mongoose将AngularJS与MongoDB连接。我想传递控制器要使用的模型,所以我可以$ scope到数据。我不确定是否必须设置Angular Service,如果可以,您是否可以指出正确的方向。谢谢。 概述: 模型: 控制器: 问题答案: 您将需要一个临时步骤。直接从Angular转到Mongo是行不通的。如果您想要Mongo的通用REST接口,可以使用Ang
本文向大家介绍MongoDB使用updateOne()和insertOne(),包括了MongoDB使用updateOne()和insertOne()的使用技巧和注意事项,需要的朋友参考一下 MongoDB insertOne()将文档插入到集合中,而updateOne()基于查询过滤器更新集合中的单个文档。 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产