Skip to content

All collections duplicated across all databases #4381

@NRaf

Description

@NRaf

I have a multi-module maven project split up by domains (as in domain-driven design). A requirement is that each domain has its own database. To reduce costs, the decision was made at this stage to keep each database running on a single Mongo server but having its own configuration.

I've included two sample configurations below, but there are a few more.

The issue I'm facing is that all the collections are being created in each database. e.g. the database for Domain A will also have the collections for Domain B, C and D. Domain B will have the collections for A, C and D, and so on.

The data is being persisted to the correct collection, and all the "redundant" collections are empty. I would like to figure out how to resolve this issue so that each database only has the collections for it's associated entities.

Domain A config

@Configuration
@EnableMongoRepositories(
        basePackageClasses = {DomainAMongoRepository.class},
        mongoTemplateRef = "domainAMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainADbMongoConfiguration.class)
public class DomainADbConfig extends AbstractMongoClientConfiguration {
    private final DomainADbMongoConfiguration mongoConfiguration;

    @Autowired
    public DomainADbConfig(DomainADbMongoConfiguration mongoConfiguration) {
        this.mongoConfiguration = mongoConfiguration;
    }

    @Primary
    @Bean(name = "domainAMongoTemplate")
    public MongoTemplate domainAMongoTemplate(
            @Qualifier("domainAMongoDbFactory") MongoDatabaseFactory mongoDbFactory,
            @Qualifier("domainAMongoConverter") MappingMongoConverter mongoConverter
    ) {
        return new MongoTemplate(mongoDbFactory, mongoConverter);
    }

    @Primary
    @Bean(name = "domainAMongoDbFactory")
    public MongoDatabaseFactory mongoDbFactory(
            @Qualifier("domainAMongoClient") MongoClient mongoClient
    ) {
        return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
    }

    @Primary
    @Bean(name = "domainAMongoConverter")
    public MappingMongoConverter mongoConverter() throws Exception {
        MongoMappingContext mongoMappingContext =
                mongoMappingContext(customConversions(), mongoManagedTypes());
        mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
        mongoMappingContext.afterPropertiesSet();

        MappingMongoConverter converter =
                new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()), mongoMappingContext);
        converter.setCustomConversions(customConversions());
        converter.afterPropertiesSet();

        return converter;
    }

    @Override
    @Bean(name = "domainAMongoClient")
    @Primary
    public MongoClient mongoClient() {
        return MongoClients.create(
                MongoClientSettings.builder()
                        .uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
                        .applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
                        .build());
    }

    @Override
    protected String getDatabaseName() {
        return mongoConfiguration.getDatabase();
    }
}

@ConfigurationProperties("domain-a.mongo")
class DomainADbMongoConfiguration {
    private String database;
    private String uri;

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}
}

Domain B config

@Configuration
@EnableMongoRepositories(
        basePackageClasses = {DomainBTypeMongoRepository.class, DomainBMongoRepository.class},
        mongoTemplateRef = "domainBMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainBDbMongoConfiguration.class)
public class DomainBDbConfig extends AbstractMongoClientConfiguration {
    private final DomainBDbMongoConfiguration mongoConfiguration;

    @Autowired
    public DomainBDbConfig(DomainBDbMongoConfiguration mongoConfiguration) {
        this.mongoConfiguration = mongoConfiguration;
    }

    @Bean(name = "domainBMongoTemplate")
    public MongoTemplate topicMongoTemplate(
            @Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory,
            @Qualifier("domainBMongoConverter") MappingMongoConverter domainBMongoConverter) {
        log.info("Connecting to Mongo DomainBs db");
        return new MongoTemplate(domainBMongoDbFactory, domainBMongoConverter);
    }

    @Bean(name = "domainBMongoDbFactory")
    public MongoDatabaseFactory mongoDbFactory(
            @Qualifier("domainBMongoClient") MongoClient mongoClient) {
        return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
    }

    @Bean(name = "domainBMongoConverter")
    public MappingMongoConverter mongoConverter(
            @Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory) throws Exception {
        MongoMappingContext mongoMappingContext =
                mongoMappingContext(customConversions(), mongoManagedTypes());
        mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
        mongoMappingContext.afterPropertiesSet();

        MappingMongoConverter converter =
                new MappingMongoConverter(
                        new DefaultDbRefResolver(domainBMongoDbFactory), mongoMappingContext);
        converter.setCustomConversions(customConversions());
        converter.afterPropertiesSet();

        return converter;
    }

    @Override
    @Bean(name = "domainBMongoClient")
    public MongoClient mongoClient() {
        return MongoClients.create(
                MongoClientSettings.builder()
                        .uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
                        .applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
                        .build());
    }

    @Override
    protected boolean autoIndexCreation() {
        return true;
    }

    @Override
    protected String getDatabaseName() {
        return mongoConfiguration.getDatabase();
    }
}

@ConfigurationProperties("domainBs.mongo")
class DomainBDbMongoConfiguration {
    private String uri;
    private String database;

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions