我在一家拥有多个品牌的公司工作,因此我们在一些不同的主机上拥有几个MongoDB 实例,为每个品牌的客户持有相同的文档模型。(相同的结构,不同的数据)为简单起见,假设我们有一个Orange品牌,数据库实例服务于端口27017和Banana品牌,数据库实例服务于端口27018目前我正在开发一种欺诈检测服务,该服务需要连接到所有数据库并一起分析所有客户的行为,无论品牌如何。所以我的“模型”有一个Customer的共享实体,用@Document (org.springframework.data.mongodb.core.mapping.Document)注释接下来我有两个 MongoRepositories,例如:public interface BananaRepository extends MongoRepository<Customer, String> List<Customer> findAllByEmail(String email);public interface OrangeRepository extends MongoRepository<Customer, String> List<Customer> findAllByEmail(String email);使用一些存根方法通过 Id、Email 等查找客户。Spring 负责为此类接口生成所有实现类(非常标准的 spring 东西)为了提示每个存储库连接到正确的 mongodb 实例,我需要两个 Mongo Config,例如:@Configuration@EnableMongoRepositories(basePackageClasses = {Customer.class})public class BananaConfig extends AbstractMongoConfiguration { @Value("${database.mongodb.banana.username:}") private String username; @Value("${database.mongodb.banana.database}") private String database; @Value("${database.mongodb.banana.password:}") private String password; @Value("${database.mongodb.banana.uri}") private String mongoUri; @Override protected Collection<String> getMappingBasePackages() { return Collections.singletonList("com.acme.model"); } @Override protected String getDatabaseName() { return this.database; }我对Orange也有类似的配置,它指向正确的 mongo 实例。请注意,我调用了两个存储库,然后将结果收集到一个列表中我期望发生的是每个存储库都将连接到其相应的 mongo 实例并通过其电子邮件查询客户。但这并没有发生。我总是对同一个 mongo 实例执行查询。但是在数据库日志中,我可以看到 spring 建立了两个连接。它只使用一个连接来运行两个存储库的查询。这并不奇怪,因为两个 Mongo Config 都指向同一个模型包。对。但我也尝试了其他方法,例如创建一个BananaCustomer 扩展 Customer到它自己的model.banana包中,另一个OrangeCustomer 扩展 Customer到它的model.orange包中,同时在每个config中指定正确的 basePackageClasses。但这两个都不起作用,我最终让这两个查询都针对同一个数据库运行。:(在搜索了几个小时的 Spring-data-mongodb 官方文档,并在这里和那里查看了数千行代码之后,我已经没有选择了:似乎没有人做过我之前想要完成的事情。 除了这里这个人必须做同样的事情,但使用 JPA 而不是 mongodb:链接到文章好吧,虽然它仍然是弹簧数据,但它不是用于 mongodb。所以这是我的问题:¿ 如何明确告诉每个存储库使用特定的 mongo 配置?神奇的自动装配规则,除非它不起作用并且没有人了解魔法。提前致谢。
1 回答
侃侃尔雅
TA贡献1801条经验 获得超15个赞
好吧,我有一个非常详细的答案,但 StackOverflow 抱怨看起来像垃圾邮件并且不允许我发布
完整答案仍可在此处作为 Gist 文件获得
底线是MongoRepository(接口)和模型对象必须放在同一个包中。
添加回答
举报
0/150
提交
取消