如何配置 spring-data-mongodb 以使用 2 个不同的 mongo

我在一家拥有多个品牌的公司工作,因此我们在一些不同的主机上拥有几个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 配置?


神奇的自动装配规则,除非它不起作用并且没有人了解魔法。


提前致谢。


呼如林
浏览 148回答 1
1回答

侃侃尔雅

好吧,我有一个非常详细的答案,但 StackOverflow 抱怨看起来像垃圾邮件并且不允许我发布完整答案仍可在此处作为 Gist 文件获得底线是MongoRepository(接口)和模型对象必须放在同一个包中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java