Support of MongoDB for Spring Data

CAST supports MongoDB via its com.castsoftware.nosqljavaexternal link extension. Details about the support provided for Java with Spring Data source code is discussed below.

Supported Libraries

Library Version Supported
Spring Data MongoDB external link Up to: 3.2.x (tick)

Supported Operations

Operation Scenario

Methods Supported

Insert Repository APIs

org.springframework.data.repository.CrudRepository.save

org.springframework.data.repository.CrudRepository.saveAll

org.springframework.data.repository.ReactiveCrudRepository.save

org.springframework.data.repository.ReactiveCrudRepository.saveAll

org.springframework.data.repository.MongoRepository.insert

org.springframework.data.repository.MongoRepository.save

org.springframework.data.repository.MongoRepository.saveAll

org.springframework.data.repository.ReactiveMongoRepository.saveAll

org.springframework.data.repository.MongoRepository.save

org.springframework.data.repository.ReactiveMongoRepository.insert

Insert Template and operation APIs

org.springframework.data.mongodb.core.MongoTemplate.insert

org.springframework.data.mongodb.core.MongoTemplate.insertAll

org.springframework.data.mongodb.core.MongoTemplate.save

org.springframework.data.mongodb.core.MongoTemplate.upsert

org.springframework.data.mongodb.core.BulkOperations.insert

org.springframework.data.mongodb.core.BulkOperations.upsert

org.springframework.data.mongodb.core.ReactiveMongoTemplate.insert

org.springframework.data.mongodb.core.ReactiveMongoTemplate.insertAll

org.springframework.data.mongodb.core.ReactiveMongoTemplate.save

org.springframework.data.mongodb.core.ReactiveMongoTemplate.upsert

org.springframework.data.mongodb.core.MongoOperations.insert

org.springframework.data.mongodb.core.MongoOperations.insertAll

org.springframework.data.mongodb.core.MongoOperations.save

org.springframework.data.mongodb.core.ReactiveMongoOperations.insert

org.springframework.data.mongodb.core.ReactiveMongoOperations.insertAll

org.springframework.data.mongodb.core.ReactiveMongoOperations.upsert

Select Repository APIs

org.springframework.data.repository.CrudRepository.findAll

org.springframework.data.repository.CrudRepository.count

org.springframework.data.repository.CrudRepository.findById

org.springframework.data.repository.CrudRepository.findAllById

org.springframework.data.repository.CrudRepository.existsById

org.springframework.data.repository.PagingAndSortingRepository.findAll

org.springframework.data.repository.QueryByExampleExecutor.count

org.springframework.data.repository.QueryByExampleExecutor.exists

org.springframework.data.repository.QueryByExampleExecutor.findAll

org.springframework.data.repository.QueryByExampleExecutor.findOne

org.springframework.data.repository.ReactiveCrudRepository.findAll

org.springframework.data.repository.ReactiveCrudRepository.count

org.springframework.data.repository.ReactiveCrudRepository.findById

org.springframework.data.repository.ReactiveCrudRepository.findAllById

org.springframework.data.repository.ReactiveCrudRepository.existsById

org.springframework.data.repository.ReactiveQueryByExampleExecutor.count

org.springframework.data.repository.ReactiveQueryByExampleExecutor.exists

org.springframework.data.repository.ReactiveQueryByExampleExecutor.findAll

org.springframework.data.repository.ReactiveQueryByExampleExecutor.findOne

org.springframework.data.repository.ReactiveMongoRepository.findAll

org.springframework.data.repository.MongoRepository.findAll

org.springframework.data.repository.MongoRepository.count

org.springframework.data.repository.MongoRepository.findById

org.springframework.data.repository.MongoRepository.findAllById

org.springframework.data.repository.MongoRepository.existsById

org.springframework.data.repository.MongoRepository.findOne

org.springframework.data.repository.ReactiveMongoRepository.count

org.springframework.data.repository.ReactiveMongoRepository.findById

org.springframework.data.repository.ReactiveMongoRepository.findAllById

org.springframework.data.repository.ReactiveMongoRepository.existsById

org.springframework.data.repository.ReactiveMongoRepository.findOne

Select Template and operation APIs

org.springframework.data.mongodb.core.MongoTemplate.getCollection

org.springframework.data.mongodb.core.MongoTemplate.find

org.springframework.data.mongodb.core.MongoTemplate.findAll

org.springframework.data.mongodb.core.MongoTemplate.findAllAndRemove

org.springframework.data.mongodb.core.MongoTemplate.findAndModify

org.springframework.data.mongodb.core.MongoTemplate.findAndRemove

org.springframework.data.mongodb.core.MongoTemplate.findAndReplace

org.springframework.data.mongodb.core.MongoTemplate.findById

org.springframework.data.mongodb.core.MongoTemplate.findDistinct

org.springframework.data.mongodb.core.MongoTemplate.findOne

org.springframework.data.mongodb.core.MongoTemplate.exists

org.springframework.data.mongodb.core.MongoTemplate.count

org.springframework.data.mongodb.core.MongoTemplate.collectionExists

org.springframework.data.mongodb.core.MongoTemplate.stream

org.springframework.data.mongodb.core.MongoTemplate.group

org.springframework.data.mongodb.core.MongoTemplate.geoNear

org.springframework.data.mongodb.core.MongoTemplate.aggregate

org.springframework.data.mongodb.core.MongoTemplate.aggregateStream

org.springframework.data.mongodb.core.MongoTemplate.aggregateAndReturn

org.springframework.data.mongodb.core.MongoTemplate.executeQuery

org.springframework.data.mongodb.core.ReactiveMongoTemplate.getCollection

org.springframework.data.mongodb.core.ReactiveMongoTemplate.find

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAll

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAllAndRemove

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAndModify

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAndRemove

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAndReplace

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findById

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findDistinct

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findOne

org.springframework.data.mongodb.core.ReactiveMongoTemplate.exists

org.springframework.data.mongodb.core.ReactiveMongoTemplate.count

org.springframework.data.mongodb.core.ReactiveMongoTemplate.collectionExists

org.springframework.data.mongodb.core.ReactiveMongoTemplate.stream

org.springframework.data.mongodb.core.ReactiveMongoTemplate.group

org.springframework.data.mongodb.core.ReactiveMongoTemplate.geoNear

org.springframework.data.mongodb.core.ReactiveMongoTemplate.aggregate

org.springframework.data.mongodb.core.ReactiveMongoTemplate.aggregateStream

org.springframework.data.mongodb.core.ReactiveMongoTemplate.aggregateAndReturn

org.springframework.data.mongodb.core.ReactiveMongoTemplate.executeQuery

org.springframework.data.mongodb.core.MongoOperations.aggregate

org.springframework.data.mongodb.core.MongoOperations.aggregateStream

org.springframework.data.mongodb.core.MongoOperations.aggregateAndReturn

org.springframework.data.mongodb.core.MongoOperations.collectionExists

org.springframework.data.mongodb.core.MongoOperations.count

org.springframework.data.mongodb.core.MongoOperations.exists

org.springframework.data.mongodb.core.MongoOperations.find

org.springframework.data.mongodb.core.MongoOperations.findAll

org.springframework.data.mongodb.core.MongoOperations.findAllAndRemove

org.springframework.data.mongodb.core.MongoOperations.findAndModify

org.springframework.data.mongodb.core.MongoOperations.findAndRemove

org.springframework.data.mongodb.core.MongoOperations.findAndReplace

org.springframework.data.mongodb.core.MongoOperations.findById

org.springframework.data.mongodb.core.MongoOperations.findOne

org.springframework.data.mongodb.core.MongoOperations.geoNear

org.springframework.data.mongodb.core.MongoOperations.getCollection

org.springframework.data.mongodb.core.MongoOperations.group

org.springframework.data.mongodb.core.ReactiveMongoOperations.aggregate

org.springframework.data.mongodb.core.ReactiveMongoOperations.aggregateStream

org.springframework.data.mongodb.core.ReactiveMongoOperations.aggregateAndReturn

org.springframework.data.mongodb.core.ReactiveMongoOperations.collectionExists

org.springframework.data.mongodb.core.ReactiveMongoOperations.count

org.springframework.data.mongodb.core.ReactiveMongoOperations.exists

org.springframework.data.mongodb.core.ReactiveMongoOperations.find

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAll

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAllAndRemove

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAndModify

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAndRemove

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAndReplace

org.springframework.data.mongodb.core.ReactiveMongoOperations.findById

org.springframework.data.mongodb.core.ReactiveMongoOperations.findOne

org.springframework.data.mongodb.core.ReactiveMongoOperations.geoNear

org.springframework.data.mongodb.core.ReactiveMongoOperations.getCollection

org.springframework.data.mongodb.core.ReactiveMongoOperations.group

Delete Repository APIs

org.springframework.data.repository.CrudRepository.deleteAll

org.springframework.data.repository.CrudRepository.deleteById

org.springframework.data.repository.CrudRepository.delete

org.springframework.data.repository.ReactiveCrudRepository.deleteAll

org.springframework.data.repository.ReactiveCrudRepository.deleteById

org.springframework.data.repository.ReactiveCrudRepository.delete

org.springframework.data.repository.ReactiveMongoRepository.deleteAll

org.springframework.data.repository.ReactiveMongoRepository.deleteById

org.springframework.data.repository.ReactiveMongoRepository.delete

org.springframework.data.repository.MongoRepository.delete

org.springframework.data.repository.MongoRepository.deleteAll

org.springframework.data.repository.MongoRepository.deleteById

Delete Template and operation APIs

org.springframework.data.mongodb.core.MongoTemplate.findAndRemove

org.springframework.data.mongodb.core.MongoTemplate.findAllAndRemove

org.springframework.data.mongodb.core.MongoTemplate.dropCollection

org.springframework.data.mongodb.core.BulkOperations.remove

org.springframework.data.mongodb.core.MongoTemplate.remove

org.springframework.data.mongodb.core.ReactiveMongoTemplate.remove

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAndRemove

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAllAndRemove

org.springframework.data.mongodb.core.ReactiveMongoTemplate.dropCollection

org.springframework.data.mongodb.core.ReactiveBulkOperations.remove

org.springframework.data.mongodb.core.MongoOperations.dropCollection

org.springframework.data.mongodb.core.MongoOperations.findAndRemove

org.springframework.data.mongodb.core.MongoOperations.findAllAndRemove

org.springframework.data.mongodb.core.MongoOperations.remove

org.springframework.data.mongodb.core.ReactiveMongoOperations.dropCollection

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAndRemove

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAllAndRemove

org.springframework.data.mongodb.core.ReactiveMongoOperations.remove

Update Template and operation APIs

org.springframework.data.mongodb.core.MongoTemplate.upsert

org.springframework.data.mongodb.core.MongoTemplate.update

org.springframework.data.mongodb.core.MongoTemplate.updateFirst

org.springframework.data.mongodb.core.MongoTemplate.updateMulti

org.springframework.data.mongodb.core.MongoTemplate.findAndModify

org.springframework.data.mongodb.core.MongoTemplate.findAndReplace

org.springframework.data.mongodb.core.BulkOperations.updateOne

org.springframework.data.mongodb.core.BulkOperations.updateMulti

org.springframework.data.mongodb.core.BulkOperations.upsert

org.springframework.data.mongodb.core.BulkOperations.replaceOne

org.springframework.data.mongodb.core.ReactiveMongoTemplate.upsert

org.springframework.data.mongodb.core.ReactiveMongoTemplate.update

org.springframework.data.mongodb.core.ReactiveMongoTemplate.updateFirst

org.springframework.data.mongodb.core.ReactiveMongoTemplate.updateMulti

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAndModify

org.springframework.data.mongodb.core.ReactiveMongoTemplate.findAndReplace

org.springframework.data.mongodb.core.ReactiveBulkOperations.updateOne

org.springframework.data.mongodb.core.ReactiveBulkOperations.updateMulti

org.springframework.data.mongodb.core.ReactiveBulkOperations.upsert

org.springframework.data.mongodb.core.MongoOperations.findAndModify

org.springframework.data.mongodb.core.MongoOperations.findAndReplace

org.springframework.data.mongodb.core.MongoOperations.upsert

org.springframework.data.mongodb.core.MongoOperations.updateFirst

org.springframework.data.mongodb.core.MongoOperations.updateMulti

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAndModify

org.springframework.data.mongodb.core.ReactiveMongoOperations.findAndReplace

org.springframework.data.mongodb.core.ReactiveMongoOperations.upsert

org.springframework.data.mongodb.core.ReactiveMongoOperations.updateFirst

org.springframework.data.mongodb.core.ReactiveMongoOperations.updateMulti

Objects

Icon Description

Java MongoDB database

Java MongoDB collection

Java unknown MongoDB database

Java unknown MongoDB collection
Link type Source and destination of link Methods supported
parentLink

Between Mongo Objects (Collection → Database → Project)

-
useLink Between the caller Spring Data Java Method objects and Mongo Collection Object

mapReduce

useSelectLink

Between the caller Spring Data Java Method objects and Mongo Collection Object

find

findAll

findById

findAllById

findAll

count

existsById

exists

findAndRemove

findAllAndRemove

findAndReplace

findAndModify

findOne

stream

group

geoNear

aggregate

aggregateStream

aggregateAndReturn

executeQuery

getCollection

findDistinct

useUpdateLink Between the caller Spring Data Java Method objects and Mongo Collection Object

upsert

update

updateFirst

updateOne

updateMulti

findAndModify

findAndReplace

useDeleteLink Between the caller Spring Data Java Method objects and Mongo Collection Object

deleteAll

deleteById

delete

findAndRemove

dropCollection

remove

findAllAndRemove

useInsertLink Between the caller Spring Data Java Method objects and Mongo Collection Object

save

saveAll

insert

insertAll

upsert

What results can you expect

Some example scenarios are shown below:

Creation of database objects

With application.properties

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=hc4

logging.level.org.springframework.data=debug
logging.level.=error

With Java configuration file

package com.mkyong;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import com.mongodb.Mongo;
import com.mongodb.MongoClient;

@Configuration
@EnableMongoRepositories
public class ApplicationConfig extends AbstractMongoConfiguration{
     @Override
     @Bean
      protected String getDatabaseName() {
        return "e-store";
      }

      @Override
      protected String getMappingBasePackage() {
        return "com.oreilly.springdata.mongodb";
      }
    @Override
    @Bean
    public Mongo mongo() throws Exception {
        // TODO Auto-generated method stub
        return new Mongo("localhost");
    }
}

Insert Operation

public Product getMrepefOne () {
    Product product = new Product("LN1", "London", 5.0f);
    productRepository.save(product);

    return productRepository.findOne("LN1");
}

@Override
    public BulkWriteResult bulk(Collection<? extends T> objects) {
      Assert.notNull(objects, "Objects must not be null!");
      return mongoTemplate.bulkOps(bulkMode != null ? bulkMode : BulkMode.ORDERED, Product.class)
          .insert(new ArrayList<>(objects)).execute();
    }

Update Operation

public String updateAlertStatus(String alertId) {

        LOGGER.debug("FanAlertsRepository.deleteAlert() with param{0}" + alertId);
        Query query = new Query();

        query.addCriteria(Criteria.where(AlertServiceConstants._ID_FILED).is(new ObjectId(alertId)));

        FanAlerts fanAlert = mongoOperation.findOne(query, FanAlerts.class,
                AlertServiceConstants.FAN_ALERTS_COLLECTION);
        if (fanAlert == null) {
            return AlertServiceConstants.failure;
    

Delete Operation

public Response deleteTn(String siteId, String tn) {
        DeleteResult deleteres = mongoCon.getCollection()
                    .deleteOne(new Document().append(DETAILSSITE_IDEN, siteId).append(DETAILS_TN, tn));
}

Select Operation

public GeoResults getProductByLocation (double longitude,double latitude,double distance){
    Point p = new Point(longitude, latitude);
    NearQuery nearQuery  = NearQuery.near(p, Metrics.KILOMETERS).maxDistance(distance);
    return mongoTemplate.geoNear(nearQuery, Product.class);
    
}

Query Methods 

@Query("{ 'age' : { $gt: ?0, $lt: ?1 } }")
    List<User> findUsersByAgeBetween(int ageGT, int ageLT);

Known Limitations

  • Resolution of Database and Collection is limited, “Unknown” is used when not resolved.
  • Query method results in link between query method and repository collection (domain entity) and not between the actual caller method and repository collection