How To Configure MongoDb Collection Name For a Class in Spring Data How To Configure MongoDb Collection Name For a Class in Spring Data spring spring

How To Configure MongoDb Collection Name For a Class in Spring Data


The only way you can currently achieve this is by annotating your domain class with @Document using the collection property to define the name of the collection instances of this class shall be persisted to.

However, there's a JIRA issue open that suggests adding a pluggable naming strategy to configure the ways class, collection and property names are handled in a more global way. Feel free to comment your use case and vote it up.


using answer from Oliver Gierke above,working on a project where I need to create multiple collections for one entity, I wanted to use the spring repositories and needed to specify the entity to use before using the repository.

I managed to modify the repository collection name on demand using this system, it using SPeL. You can only work on 1 collection at a time though.

Domain object

@Document(collection = "#{personRepository.getCollectionName()}")public class Person{}

Default Spring Repository:

public interface PersonRepository      extends MongoRepository<Person, String>, PersonRepositoryCustom{}

Custom Repository Interface:

public interface PersonRepositoryCustom {    String getCollectionName();    void setCollectionName(String collectionName);}

implementation:

public class PersonRepositoryImpl implements PersonRepositoryCustom {    private static String collectionName = "Person";    @Override    public String getCollectionName() {        return collectionName;    }    @Override    public void setCollectionName(String collectionName) {        this.collectionName = collectionName;    }}

To use it:

@AutowiredPersonRepository personRepository;public void testRetrievePeopleFrom2SeparateCollectionsWithSpringRepo(){        List<Person> people = new ArrayList<>();        personRepository.setCollectionName("collectionA");        people.addAll(personRepository.findAll());        personDocumentRepository.setCollectionName("collectionB");        people.addAll(personRepository.findAll());        Assert.assertEquals(4, people.size());}

Otherwise if you need to use configuration variables, you could maybe use something like this? source

@Value("#{systemProperties['pop3.port'] ?: 25}") 


A little late,but I've found you can set the mongo collection name dynamically in spring-boot accessing the application configuration directly.

@Document(collection = "#{@environment.getProperty('configuration.property.key')}")public class DomainModel {...}

I suspect you can set any annotation attribute this way.