我在一家擁有多個品牌的公司工作,因此我們在一些不同的主機上擁有幾個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條經驗 獲得超16個贊
好吧,我有一個非常詳細的答案,但 StackOverflow 抱怨看起來像垃圾郵件并且不允許我發布
完整答案仍可在此處作為 Gist 文件獲得
底線是MongoRepository(接口)和模型對象必須放在同一個包中。
添加回答
舉報
0/150
提交
取消