In this brief article, we will see how we can use MongoDB Atlas with Spring Boot. MongoDB Atlas is Database as a Service. With database available on the cloud you can scale it as and when you need.
Software used
- Spring Boot 2.0.6.RELEASE
- MongoDB Atlas
- Java 8
- Maven
- Eclipse
POM
xdependenciesx xdependencyx xgroupIdxorg.springframework.bootx/groupIdx xartifactIdxspring-boot-starter-data-mongodbx/artifactIdx x/dependencyx xdependencyx xgroupIdxorg.projectlombokx/groupIdx xartifactIdxlombokx/artifactIdx xoptionalxtruex/optionalx x/dependencyx xdependencyx xgroupIdxorg.springframework.bootx/groupIdx xartifactIdxspring-boot-starter-testx/artifactIdx xscopextestx/scopex x/dependencyx x/dependenciesx
Spring has always made development easy. For our POC as well we are using pre-built dependencies for MongoDB. Along with spring-boot-starter-data-mongodb we will use Project Lombok for easy POJO management.
MongoDB Atlas URL
To connect to MongoDB on the cloud you need to have the exact URL of your database with user and password. You can get this URL in your Atlas account as shown below
For our example, we have added below in our application.properties
spring.data.mongodb.uri=mongodb+srv://nodeuser:nodepwd@opencodez-pzgjy.gcp.mongodb.net/test?retryWrites=true spring.data.mongodb.database=test
You may have to change IP whitelisting as well because by default MongoDB Atlas wonxt allow connecting from any IP address.
Define Collection
MongoDB is a NoSQL database, so it uses collections concept instead of tables. We will define our collection java mapping as below
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;
@Data
@Document(collection = "users")
public class Users {
@Id
private String id;
private String name;
private String address;
private Double salary;
public Users(String name, String address, Double salary) {
this.name = name;
this.address = address;
this.salary = salary;
}
}
The java class also has a convenience constructor defined.
Define Repository
As we are using Spring Data for MongoDB, defining a repository is as easy as adding an interface like below
public interface UserRepository extends MongoRepositoryxUsers, Stringx {
}
Thatxs it, with above interface you will get access to all the CRUD operations around the MongoDB collection. If you need you can add some methods for your convenience as well
public interface UserRepository extends MongoRepositoryxUsers, Stringx {
Users findFirstByName(String name);
@Query("{address:'?0'}")
ListxUsersx findCustomByAddress(String address);
@Query("{address : { $regex: ?0 } }")
ListxUsersx findCustomByRegExAddress(String domain);
}
You can see that the interface supports methods based on field names as well as it supports the query based on JSON.
Custom MongoDB Repository
Apart from the standard Spring Data Repository, you can define your own as well. In that case, you can use MongoTemplate. A sample is also included below for reference
public interface CustomRepository {
long updateUser(String address, Double salary);
}
Implementation
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import com.mongodb.client.result.UpdateResult;
import com.opencodez.domain.Users;
@Component
public class CustomRepositoryImpl implements CustomRepository {
@Autowired
MongoTemplate mongoTemplate;
@Override
public long updateUser(String address, Double salary) {
Query query = new Query(Criteria.where("address").is(address));
Update update = new Update();
update.set("salary", salary);
UpdateResult result = mongoTemplate.updateFirst(query, update, Users.class);
if (result != null)
return result.getModifiedCount();
else
return 0;
}
}
The implementation is self-explanatory and I hope does not require any details.
Running the example
As we are using Spring Boot, we will add a command line runner with all the utility methods in it.
@SpringBootApplication
public class MongoBootApplication implements CommandLineRunner {
@Autowired
UserRepository repository;
@Autowired
CustomRepository crepo;
public static void main(String[] args) {
SpringApplication.run(MongoBootApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
deleteAll();
addSampleData();
listAll();
findFirst();
findByRegex();
}
public void deleteAll() {
System.out.println("Deleting all records..");
repository.deleteAll();
}
public void addSampleData() {
System.out.println("Adding sample data");
repository.save(new Users("Jack Bauer", "New York", 11111d));
repository.save(new Users("Harvey Spectre", "London", 22222d));
repository.save(new Users("Mike Ross", "New Jersey", 333333d));
repository.save(new Users("Louise Litt", "Kathmandu", 44444d));
}
public void listAll() {
System.out.println("Listing sample data");
repository.findAll().forEach(u -x System.out.println(u));
}
public void findFirst() {
System.out.println("Finding first by Name");
Users u = repository.findFirstByName("Louise Litt");
System.out.println(u);
}
public void findByRegex() {
System.out.println("Finding by Regex - All with address starting with ^New");
repository.findCustomByRegExAddress("^New").forEach(u -x System.out.println(u));
}
}
The output
Deleting all records..
2018-10-26 21:39:40.701 INFO 32780 --- [ main] org.mongodb.driver.connection : Opened connection [connectionId{localValue:4, serverValue:1761}] to opencodez-shard-00-01-pzgjy.gcp.mongodb.net:27017
Adding sample data
Listing sample data
Users(id=5bd33c44769b73800cc40c98, name=Jack Bauer, address=New York, salary=11111.0)
Users(id=5bd33c44769b73800cc40c99, name=Harvey Spectre, address=London, salary=22222.0)
Users(id=5bd33c45769b73800cc40c9a, name=Mike Ross, address=New Jersey, salary=333333.0)
Users(id=5bd33c45769b73800cc40c9b, name=Louise Litt, address=Kathmandu, salary=44444.0)
Finding first by Name
Users(id=5bd33c45769b73800cc40c9b, name=Louise Litt, address=Kathmandu, salary=44444.0)
Finding by Regex - All with address starting with ^New
Users(id=5bd33c44769b73800cc40c98, name=Jack Bauer, address=New York, salary=11111.0)
Users(id=5bd33c45769b73800cc40c9a, name=Mike Ross, address=New Jersey, salary=333333.0)
Also below is the actual data from our MongoDB instance.
Conclusion
In this article we have seen, how easy it is to connect to a NoSQL MongoDB Cloud instance with Spring Boot. Please feel free to comment or ask a question or two.
You can find the complete source code at our GIT repository.
Download Code