Slide 1

Slide 1 text

MongoDB for Java Developers The Ultimate Spring Data MongoDB Starter Kit Christoph Strobl, R&D Engineer, Broadcom Copyright © 2005-2024 Broadcom, Inc. or its affiliates.

Slide 2

Slide 2 text

DON‘T PANIC Douglas Adams, The Hitchhiker's Guide to the Galaxy

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

MongoClient

Slide 6

Slide 6 text

Spring Data MongoDB

Slide 7

Slide 7 text

Spring Data MongoDB JPA JDBC Neo4j R2DBC ArangoDB Couchbase Cosmos DB yugabyteDB Elasticsearch Apache Cassandra ….

Slide 8

Slide 8 text

Spring Data offers Familiar & Consistent Programming Model That Respects Store Specific Traits no silver bullet no magic not one API to rule them all

Slide 9

Slide 9 text

Default Implementation Repository Interface List findByFirstName(String name) Repository Anatomy

Slide 10

Slide 10 text

Entity Manager Template API Mapping Conversion Resource & Transaction
 Management native store format <> domain type eg. enum -> string Default Implementation Repository Interface List findByFirstName(String name) Repository Anatomy

Slide 11

Slide 11 text

Entity Manager Template API Mapping Conversion Resource & Transaction
 Management native store format <> domain type eg. enum -> string Default Implementation Repository Interface List findByFirstName(String name) Repository Anatomy

Slide 12

Slide 12 text

Entity Manager Database Driver Template API Mapping Conversion Resource & Transaction
 Management native store format <> domain type eg. enum -> string Default Implementation Repository Interface List findByFirstName(String name) Repository Anatomy

Slide 13

Slide 13 text

Entity Manager Database Driver Template API Mapping Conversion Resource & Transaction
 Management native store format <> domain type eg. enum -> string Default Implementation Repository Interface List findByFirstName(String name) MongoClient Repository Anatomy

Slide 14

Slide 14 text

interface Repo extends . . . { Repository Composition

Slide 15

Slide 15 text

interface Repo extends . . . { Repository CrudRepository findAll(); findById(...) count(); save(...); delete(...); ... PagingAndSorting Repository findAll(Page); findAll(Sort); Repository Composition

Slide 16

Slide 16 text

interface Repo extends . . . { Repository CrudRepository findAll(); findById(...) count(); save(...); delete(...); ... PagingAndSorting Repository findAll(Page); findAll(Sort); Proxy Default Implementation Store Specific Repository Composition

Slide 17

Slide 17 text

interface Repo extends . . . { Repository CrudRepository findAll(); findById(...) count(); save(...); delete(...); ... PagingAndSorting Repository findAll(Page); findAll(Sort); Proxy Default Implementation Store Specific List f i ndAll(); long count(); Predefined methods List f i ndByFirstName(String name); Derived Finder Method Repository Composition

Slide 18

Slide 18 text

Derived Queries 18 List f i ndByFirstName(String name)

Slide 19

Slide 19 text

Derived Queries 19 List f i ndByFirstName(String name) Return Type

Slide 20

Slide 20 text

Derived Queries 20 List f i ndByFirstName(String name) Return Type Operation Keyword

Slide 21

Slide 21 text

Derived Queries 21 List f i ndByFirstName(String name) Return Type Operation Keyword Match Against

Slide 22

Slide 22 text

Derived Queries 22 List f i ndByFirstName(String name) Return Type Operation Keyword Match Against Bind Argument

Slide 23

Slide 23 text

Break It Down 23 List f i ndEmployeeByFirstNameLikeOrderByAgeAsc(String name)

Slide 24

Slide 24 text

Break It Down 24 List f i ndEmployeeByFirstNameLikeOrderByAgeAsc(String name) Employee Page Slice Stream Window

Slide 25

Slide 25 text

Break It Down 25 List f i ndEmployeeByFirstNameLikeOrderByAgeAsc(String name) read get query search stream Placeholder For Anything You Like Delimiter Employee Page Slice Stream Window

Slide 26

Slide 26 text

Break It Down 26 List f i ndEmployeeByFirstNameLikeOrderByAgeAsc(String name) read get query search stream Placeholder For Anything You Like matches contains lessThan startsWith greaterThan isEmpty isNull isNotNull before after ... Match Operator Delimiter Employee Page Slice Stream Window

Slide 27

Slide 27 text

Break It Down 27 List f i ndEmployeeByFirstNameLikeOrderByAgeAsc(String name) read get query search stream Placeholder For Anything You Like matches contains lessThan startsWith greaterThan isEmpty isNull isNotNull before after ... Match Operator Sort Direction Delimiter Employee Page Slice Stream Window

Slide 28

Slide 28 text

Template APIs class MongoTemplate implements MongoOperations { List f i nd(Query query, Class entityClass) List f i ndAndRemove(Query query, Class entityClass) T execute(Class> entityClass, CollectionCallback callback) query(where(“firstName”).is(...)) template.execute(Employee.class, collection - > { return collection.f i nd(new Document("f i rstname", " .. . ")) .into(new ArrayList()); }); Access to native driver commands MongoDB

Slide 29

Slide 29 text

class Employee { Long id; String f i rstName; String lastName; } class Manager { Long id; String name; List employees } { _id : 1000, name : Marvin, employees : [ { id : 1, f i rstName : Ford, lastName : Prefect } , … ] } Basic Mapping MongoDB db.manager

Slide 30

Slide 30 text

@Document("managers") @Sharded(shardKey = { "country" }) class Manager { @Id Long id; String country; @Indexed @Field("full_name") String name; @Version Long version; @CreatedDate Instant created; @EncryptedField(altKeyName="secret",…) String ssn; @DBRef List employees; @DocumentReference Supervisor supervisor; { _id : 1000, country : space full_name : Marvin, version: 2, created: 1725879207729, ssn: *****, employees : [ { $ref : employee, $id : … }, … ], supervisor: 42 } db.managers Mapping MongoDB Advanced

Slide 31

Slide 31 text

Would it save you a lot of time if I just gave up and went mad now? Douglas Adams, The Hitchhiker's Guide to the Galaxy

Slide 32

Slide 32 text

Specific Features MongoDB @Hint("lastname - idx") List f i ndByLastname(String lastname);

Slide 33

Slide 33 text

Specific Features MongoDB @Hint("lastname - idx") List f i ndByLastname(String lastname); @Query(value="{ 'f i rst_name' : ?0 }", f i elds="{ 'f i rst_name' : 1, 'last_name' : 1}") List f i ndByFirstname(String f i rstname);

Slide 34

Slide 34 text

Specific Features MongoDB @Hint("lastname - idx") List f i ndByLastname(String lastname); @Query(value="{ 'f i rst_name' : ?0 }", f i elds="{ 'f i rst_name' : 1, 'last_name' : 1}") List f i ndByFirstname(String f i rstname); @ReadPreference("secondaryPreferred") List f i ndByFirstname(String f i rstname);

Slide 35

Slide 35 text

Specific Features MongoDB @Hint("lastname - idx") List f i ndByLastname(String lastname); @Query(value="{ 'f i rst_name' : ?0 }", f i elds="{ 'f i rst_name' : 1, 'last_name' : 1}") List f i ndByFirstname(String f i rstname); @ReadPreference("secondaryPreferred") List f i ndByFirstname(String f i rstname); List f i ndByLocationNear(Point location, Distance distance); GeoResults f i ndByLocationNear(Point location, Distance distance);

Slide 36

Slide 36 text

Specific Features MongoDB @Hint("lastname - idx") List f i ndByLastname(String lastname); @Query(value="{ 'f i rst_name' : ?0 }", f i elds="{ 'f i rst_name' : 1, 'last_name' : 1}") List f i ndByFirstname(String f i rstname); @ReadPreference("secondaryPreferred") List f i ndByFirstname(String f i rstname); List f i ndByLocationNear(Point location, Distance distance); GeoResults f i ndByLocationNear(Point location, Distance distance); @Update("{ '$inc' : { 'visits' : 1 } }") long f i ndAndIncrementVisitsByLastname(String lastname);

Slide 37

Slide 37 text

Specific Features MongoDB @Hint("lastname - idx") List f i ndByLastname(String lastname); @Query(value="{ 'f i rst_name' : ?0 }", f i elds="{ 'f i rst_name' : 1, 'last_name' : 1}") List f i ndByFirstname(String f i rstname); @ReadPreference("secondaryPreferred") List f i ndByFirstname(String f i rstname); List f i ndByLocationNear(Point location, Distance distance); GeoResults f i ndByLocationNear(Point location, Distance distance); @Update("{ '$inc' : { 'visits' : 1 } }") long f i ndAndIncrementVisitsByLastname(String lastname); List deleteByLastname(String lastname);

Slide 38

Slide 38 text

I‘d far rather be happy than right any day. Douglas Adams, The Hitchhiker's Guide to the Galaxy

Slide 39

Slide 39 text

Extension API interface AtlasRepository { List vectorSearch(String index, String path, List vector, Limit limit); } 1. Define it

Slide 40

Slide 40 text

Extension API interface AtlasRepository { List vectorSearch(String index, String path, List vector, Limit limit); } class AtlasRepositoryImpl implements AtlasRepository, RepositoryMetadataAccess { @Autowired MongoOperations mongoOperations; @Override public List vectorSearch(String index, String path, List vector, Limit limit) { RepositoryMethodContext metadata = RepositoryMethodContext.currentMethod(); Class> domainType = metadata.getRepository().getDomainType(); Document $vectorSearch = …; Aggregation aggregation = newAggregation(ctx - > $vectorSearch); return mongoOperations.aggregate(aggregation, domainType).getMappedResults(); } } 1. Define it 2. Implement it

Slide 41

Slide 41 text

Extension API interface AtlasRepository { List vectorSearch(String index, String path, List vector, Limit limit); } class AtlasRepositoryImpl implements AtlasRepository, RepositoryMetadataAccess { @Autowired MongoOperations mongoOperations; @Override public List vectorSearch(String index, String path, List vector, Limit limit) { RepositoryMethodContext metadata = RepositoryMethodContext.currentMethod(); Class> domainType = metadata.getRepository().getDomainType(); Document $vectorSearch = …; Aggregation aggregation = newAggregation(ctx - > $vectorSearch); return mongoOperations.aggregate(aggregation, domainType).getMappedResults(); } } interface MovieRepository extends CrudRepository, AtlasRepository { } 1. Define it 2. Implement it 2. Use it

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

start.spring.io Thank you!