@Document - specify collection @Field - specify column (field) name @Indexed - add field to index @TextIndexed - full text index @Transient - do not store @DBRef - ref @PersistentConstructor - use this constractor for deserialization
@Repository @Query
@Query("{ 'name' : ?0 }")
List<User> findUsersByName(String name);
@Query("{ 'name' : { $regex: ?0 } }")
List<User> findUsersByRegexpName(String regexp);
@Query("{ 'age' : { $gt: ?0, $lt: ?1 } }")
List<User> findUsersByAgeBetween(int ageGT, int ageLT);
- Query
- Criteria
- MongoTemplate.find
- PageRequest.of
- Sort.by
Examples:
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("c$"));
List<User> users = mongoTemplate.find(query, User.class);
Query query = new Query();
query.with(Sort.by(Sort.Direction.ASC, "age"));
List<User> users = mongoTemplate.find(query,User.class);
final Pageable pageableRequest = PageRequest.of(0, 2);
Query query = new Query();
query.with(pageableRequest);
Maven: querydsl-mongodb https://mvnrepository.com/artifact/com.querydsl/querydsl-mongodb/4.1.4
QueryDslPredicateExecutor
QUser qUser = new QUser("user");
Predicate predicate = qUser.name.eq("Eric");
List<User> users = (List<User>) userRepository.findAll(predicate);
Find avg from sub-array:
db.legosets.aggregate([{
$project: {
legoSetName: "$name",
avgRating: {$avg: "$reviews.rating"}
}
}])
ProjectionOperation projectToMatchModel = project()
.andExpression("name").as("productName")
.andExpression("{$avg : '$reviews.rating'}").as("avgRating");
Aggregation avgRatingAggregation = newAggregation(LegoSet.class, projectToMatchModel);
return this.mongoTemplate
.aggregate(avgRatingAggregation, LegoSet.class, AvgRatingModel.class)
.getMappedResults();
- annotate fields with @TextIndexed
- create documents with MongoRepository
- search with method in repository:
// repository
Collection<LegoSet> findAllBy(TextCriteria textCriteria);
// controller
@GetMapping("fullTextSearch/{text}")
public Collection<LegoSet> fullTextSearch(@PathVariable String text) {
TextCriteria textCriteria = TextCriteria.forDefaultLanguage().matching(text);
return this.legoSetRepository.findAllBy(textCriteria);
}
db.getCollecion("X").find({
paymentOptions: {
"$ref": "paymentOptions",
"$id": ObjectId("5c...")
}
})
@Query("{paymentOptions.id : ?0}")
Collection<LegoSet> findByPaymentOptionId(String id);
-
tools:
- Mongo Bee - https://github.com/mongobee/mongobee
- Liquibase - https://docs.liquibase.com/install/tutorials/mongodb.html
-
annotate class with @ChangeLog
-
annotate change/method with @ChangeSet
-
sample:
@ChangeSet(order = "001", author = "ray", id = "update nb parts")
public void updateNbOfParts(MongoTemplate mongoTemplate) {
Criteria priceZeroCriteria = new Criteria().orOperator(
Criteria.where("nbParts").is(0),
Criteria.where("nbParts").is(null)
);
mongoTemplate.updateMulti(
new Query(priceZeroCriteria),
Update.update("nbParts", 122),
LegoSet.class);
}
- trees: https://docs.mongodb.com/manual/applications/data-models-tree-structures/
- lookups: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
- graphLookups: https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#mongodb-pipeline-pipe.-graphLookup
- one-to-many: https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/#std-label-data-modeling-publisher-and-books
- schema versioning: https://docs.mongodb.com/manual/tutorial/model-data-for-schema-versioning/
- decimal (money): https://docs.mongodb.com/manual/core/shell-types/#std-label-shell-type-decimal
- text index: https://docs.mongodb.com/manual/core/index-text/
- multi-document transactions: https://docs.mongodb.com/manual/core/transactions/
- sharded collections: https://docs.mongodb.com/manual/reference/method/sh.shardCollection/#mongodb-method-sh.shardCollection
- explain, hint, indexStats:
- persistance (@Repository)
- model (@Document)
- api (@RestController)