[Spring] Spring Data MongoDB

JH·2023년 6월 2일

Spring

목록 보기
8/9

1. TIL

A. Update, Delete

1. Update

	@RequestMapping(value = "/update/rating", method = RequestMethod.GET)
	public String updateRating() {
		
		// db.rating.updateOne({})
//		mongoTemplate.updateFirst(query, update, entityClass);
		
        
        
		// db.rating.updateMany({_id : 14}, {$set : {rating : 5}})
		
		// Query, Criteria 를 분리하여 사용
		Query query = new Query();
		Criteria criteria = Criteria.where("_id").is(14);
		
		query.addCriteria(criteria);
		
        // new Query(Criteria.where("_id").is(14)) 분리하지 않는 방법
        
		// Update 객체 생성
		Update update = Update.update("rating", 8);
		
		mongoTemplate.updateMulti(query, update, Rating.class);
		
		return "home";
	}

2. Delete

	@RequestMapping(value = "/delete/rating", method = RequestMethod.GET)
	public String deleteRating() {
		
		// 1개 삭제
		Query query = new Query();
		Criteria criteria = Criteria.where("_id").is(11);
		
		query.addCriteria(criteria);
		
		// 2개 이상을 삭제
		Query query = new Query();
		Criteria criteria = new Criteria();
		criteria.orOperator(
					Criteria.where("_id").is(12),
					Criteria.where("_id").is(13)
				);
		
		query.addCriteria(criteria);
		
		mongoTemplate.remove(query, Rating.class);
		
		return "home";
	}


B. 기본 문법

1. count

	@RequestMapping(value = "/count", method = RequestMethod.GET)
	public String findRating() {
		long count = mongoTemplate.count(new Query(), Rating.class);
		
		System.out.println(count);
        
		return "home";
	}

2. limit

	// limit()
    // db.rating.find().limit(3)
	@RequestMapping(value = "/find/rating/limit", method = RequestMethod.GET)
	public String limit() {
		List<Rating> ratingLimitList = mongoTemplate.find(new Query().limit(3), Rating.class);
		
		ratingLimitList.forEach((rating) -> {System.out.println(rating);});
		
		return "home";
	}

3. distinct()

	// distinct()
    // db.rating.distinct("rating")
	@RequestMapping(value = "/find/rating/distinct", method = RequestMethod.GET)
	public String distinct() {
		List<Double> ratingDistinctList = mongoTemplate.findDistinct("rating", Rating.class, Double.class);
		
		ratingDistinctList.forEach(rating -> System.out.println(rating));
		
		return "home";
	}

4. sort()

	// sort
    // db.rating.find().sort({user_id : 1});
	@RequestMapping(value = "/find/rating/sort", method = RequestMethod.GET)
	public String sort() {
		List<Rating> ratingSortedList = mongoTemplate.find(new Query()
														.with(Sort.by(Sort.Direction.ASC, "user_id")), Rating.class);
		
		ratingSortedList.forEach(rating -> System.out.println(rating));
		return "home";
	}

5. regex + projection

	@RequestMapping(value = "/find/orders/regex", method = RequestMethod.GET)
	public String regex() {
		Query regexQuery = new Query();
		
		Criteria regexCriteria = Criteria.where("order_user").regex("^m");
		
		// 출력하고 싶은 필드 선정 : query.fields()
		// 출력하고 싶은 필드 : include
		// 출력하고 싶지 않는 필드 : exclude
        
		regexQuery.fields().exclude("_id");
				
		regexQuery.addCriteria(regexCriteria);
		
		List<Orders> regexList = mongoTemplate.find(regexQuery, Orders.class);
		regexList.forEach(orders -> System.out.println(orders));
		
		// 출력 : Orders [_id=null, order_id=999.0, order_user=matt, product_id=123.0]
		
		// exclude를 사용하면 제외되는 필드가 많아질 수 있음
		// DTO객체와 연결시 null 표현이 많아질 수 밖에 없음
		// 이를 해결하기 위해 Document 타입을 사용 할 수 있음
		
		List<Document> regexDocumentList = mongoTemplate.find(regexQuery, Document.class, "orders");
		regexDocumentList.forEach((document) -> {System.out.println(document);});
		
		// 출력 : Document{{order_id=999.0, order_user=matt, product_id=123.0}}
		return "home";
	}

6. Pagenation

	// pagenation : 페이지 당 출력할 객체 개수 지정 및 반환
	@RequestMapping(value = "/find/zip/pagenation", method = RequestMethod.GET)
	public String pagenation() {
		Query pagenationQuery = new Query();
		pagenationQuery.with(PageRequest.of(0, 10));
		
		List<Document> zipList = mongoTemplate.find(pagenationQuery, Document.class, "zip");
		zipList.forEach(data -> System.out.println(data));
		
		return "home";
	}


C. Aggregate

1. Aggregate : $project + $limit

	// aggregate
	@RequestMapping(value = "/aggregate", method = RequestMethod.GET)
	public String aggregate() {
		// spring-data-mongoDB 집계 메소드의 형태
		// aggregation : 집계 객체
		// collectionName : 대상 컬렉션명
		// outputType : 출력 객체 클래스
		// mongoTemplate.aggregate(aggregation, collectionName ,outputType)
		
		// $project
		// db.rating.aggregate([ {$project : {_id : 0, rating : 1}}, {$limit : 3} ])
		
		ProjectionOperation project = Aggregation.project("rating");
		LimitOperation limit = Aggregation.limit(3);
		
		Aggregation aggregation = Aggregation.newAggregation(project, limit);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"rating", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

2. Aggregate : $match

	@RequestMapping(value = "/aggregate/match", method = RequestMethod.GET)
	public String match() {
		MatchOperation match = Aggregation.match(
					Criteria.where("rating").is(3)
				);
		
		Aggregation aggregation = Aggregation.newAggregation(match);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"rating", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

3. Aggregate : $group + $sort

	@RequestMapping(value = "/aggregate/group", method = RequestMethod.GET)
	public String group() {
		GroupOperation group = Aggregation.group("rating");
		SortOperation sort = Aggregation.sort(Sort.Direction.ASC, "_id");
		
		Aggregation aggregation = Aggregation.newAggregation(group, sort);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"rating", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

4. Aggregate : $group + count()

	@RequestMapping(value = "/aggregate/group2", method = RequestMethod.GET)
	public String group2() {
		GroupOperation group = Aggregation.group("rating").count().as("count");
		
		Aggregation aggregation = Aggregation.newAggregation(group);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"rating", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

5. Aggregate : $unwind

	@RequestMapping(value = "/aggregate/unwind", method = RequestMethod.GET)
	public String unwind() {
		UnwindOperation unwind = Aggregation.unwind("sizes");
		Aggregation aggregation = Aggregation.newAggregation(unwind);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"items", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

6. Aggregate : $addFields

	@RequestMapping(value = "/aggregate/addFields", method = RequestMethod.GET)
	public String addFields() {
		AggregationExpression homeworkSumExpression = ArithmeticOperators.valueOf("homework").sum();
		
		AddFieldsOperation addFields = Aggregation.addFields()
													.addField("totalHomework")
													.withValue(homeworkSumExpression)
													.build();
		
													
		Aggregation aggregation = Aggregation.newAggregation(addFields);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"scores", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

7. $lookup

	@RequestMapping(value = "/aggregate/lookup", method = RequestMethod.GET)
	public String lookup() {
		LookupOperation lookup = Aggregation.lookup("products", "product_id", "product_id", "order_product");
		
		Aggregation aggregation = Aggregation.newAggregation(lookup);
		
		AggregationResults<Document> projectList = mongoTemplate.aggregate(aggregation,"orders", Document.class);
		projectList.forEach(document -> System.out.println(document));
		
		return "home";
	}

profile
잘해볼게요

0개의 댓글