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.