본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


몽고DB/Java 몽고DB

Mongotemplate에서 MongoDB 증감 연산자 사용과 기타 다른 update 연산자

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 5. 14.

 

몽고템플릿을 사용하여 몽고DB에 있는 숫자형태(Int) 값을 증감시키는 방법을 소개합니다.

일반 관계형 데이터베이스에서는 증감하는 방법이 어렵지 않았습니다.

예를들어 특정한 컬럼의 데이터를 1 만큼 증가시키려면 아래와 같은 쿼리문을 동작하면 가능했습니다.

Update test_db set number = number + 1;

 

몽고DB에서도 이와 같은 기능이 존재합니다. 바로 inc라는 업데이트를 위한 연산자 입니다.

이러한 기능은 몽고템플릿에서도 동일하게 제공 됩니다.

바로 내용을 살펴보겠습니다.

 

1. 숫자형 필드에서의 데이터 증감방법

아래와 같은 데이터가 존재합니다.

아주 간단한 데이터 입니다.

 

해당 데이터에서 number값을 증감 할 수 있는 메소드를 만들어 보겠습니다.

private void numberChange(MongoTemplate template, Integer number){
    Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
    Update update = new Update();
    update.inc("number", number);  //증감시킬 숫자
    template.updateFirst(query, update, "컬렉션");
}

 

number라는 파라미터를 받게 하였습니다.

number의 값이 변화하는 만큼 도큐먼트 값 number의 데이터가 변화합니다.

음수를 넣을 경우 값이 감소하고, 양수를 넣을경우 값이 증가합니다.

위 방법을 사용하면 굳이 조회를 한 뒤에 데이터를 가져와서 증감시킨 후 update를 할 필요가 없어집니다.

 

2. 도큐먼트에서의 이름 바꾸기(key 값 변경)

다음으로 살펴볼 내용은 이름을 바꾸어 주는 rename 입니다.

rename은 아주 직관적인 메소드 입니다.

바꾸고자 하는 도큐먼트의 key 값과, 바꿀 이름을 입력하면 됩니다.

private void renameDoc(MongoTemplate template,String oldName, String newName){
    Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
    Update update = new Update();
    update.rename(oldName, newName);
    template.updateFirst(query, update, "컬렉션");		
}

 

메소드 조차도 어려운 내용이 없습니다.

rename 메소드에 해당 데이터만 입력하면 원하는 이름으로 바뀌는 것을 볼 수 있습니다.

 

3. 도큐먼트에서 특정 도큐먼트 제거(pull과 비슷한 기능)

다음으로 살펴볼 내용은 특정 도큐먼트를 제거하는 unset 기능 입니다.

unset은 이전에 언급되었던 pull과 비슷한 기능입니다.

pull이 배열에서의 데이터에 접근하여 원하는 대상을 제거하였다면, unset은 도큐먼트의 key 값을 대상으로 해당 내용을 제거합니다.

위 데이터에서 text라는 도큐먼트를 제거하여 보겠습니다.

private void removeDoc(MongoTemplate template, String key){
    Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
    Update update = new Update();
    update.unset(key);  //제거할 대상을 입력합니다.
    template.updateFirst(query, update, "컬렉션");		
}

키 값 text 도큐먼트의 데이터가 제거되었습니다.

 

 

4. 도큐먼트에서 특정 도큐먼트의 날짜를 현재 날짜로 업데이트하기

다음으로 살펴볼 내용은 특정 도큐먼트의 날짜를 현재 날짜로 업데이트하는 기능입니다.

해당 기능 또한 매우 쉽습니다.

Update 클래스에서 단순하게 currentDate 메소드만 호출하면 됩니다.

private void alterFieldCurrentDay(MongoTemplate template, String key){
    Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
    Update update = new Update();
    update.currentDate(key);
    template.updateFirst(query, update, "컬렉션");		
}		

 

해당 key 값에 내가 업데이트 하고자 하는 key값을 넣어주면 현재 일자로 데이터를 바꾸어줍니다.

text 필드의 내용이 날짜로 바뀌었습니다.

 

재미있는 점은 해당 기능은 text라는 필드의 값이 어떠한 값을 가지고 있던지, 아니면 text필드 자체가 없던지 간에 text 필드에 무조건 날짜 값을 넣어준다는 점 입니다.

 

5. 있으면 그만, 없으면 넣어주는 addToSet

말 그대로 있으면 아무런 행위를 하지 않고 없으면 데이터를 넣어주는 기능입니다.

바로 소스코드를 살펴보겠습니다.

private void addToSet(MongoTemplate template){
    Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
    Update update = new Update();
    update.addToSet("my_array", "a");  //my_array라는 배열에 a값이 없으면 넣어주고, 있으면 아무런 행위를 안한다.
    template.updateFirst(query, update, "컬렉션");		
}	

 

해당 기능 또한 매우 쉽습니다.

만약 2중배열인 경우에는 값이 단 1개라도 틀리면 배열이 새롭게 생성됩니다.

아래 사진으로 보면,

my_array필드에 a값을 가진 배열이 존재합니다.

 

그런데 사용자가 실수로 데이터를 new String[]{"a","b"} 넣었다고 가정 해 봅니다.

그러면 아래 사진처럼 1개의 데이터 행이 추가가 됩니다.

배열 1개가 추가되었습니다!

 

그러므로 addToSet을 사용 하는 경우에는 반드시 입력하는 데이터의 형태를 잘 확인하여야합니다.

my_array가 단일 배열이라고 해서 단일 배열 데이터를 넣어버리면 새로운 배열이 추가가 됩니다.

데이터의 형태를 잘 기억하고 입력 하여야 합니다.

 

 

위 내용에 대한 소스코드 전체의 모습입니다.

import org.bson.Document;
import org.bson.types.ObjectId;
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;



public class SampleMongoDB{
    
    //숫자를 증감하는 메소드 입니다. 양수면 증가, 음수면 감소합니다.
    private void numberChange(MongoTemplate template, Integer number){
        Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
        Update update = new Update();
        update.inc("number", number);  //증감시킬 숫자
        template.updateFirst(query, update, "컬렉션");
    }    
 
    //도큐먼트에서 선택한 필드의 key 값을 변경 합니다.
    private void renameDoc(MongoTemplate template,String oldName, String newName){
        Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
        Update update = new Update();
        update.rename(oldName, newName);
        template.updateFirst(query, update, "컬렉션");		
    }    

    //도큐먼트에서 선택한 필드를 제거 합니다.
    private void removeDoc(MongoTemplate template, String key){
        Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
        Update update = new Update();
        update.unset(key);  //제거할 대상을 입력합니다.
        template.updateFirst(query, update, "컬렉션");		
    }

    //현재날짜 데이터를 선택한 도큐먼트에 입력합니다.
    //해당 도큐먼트의 대상이 없다면 해당 필드를 만들어서 데이터를 insert합니다.
    //해당 도큐먼트의 대상이 있다면 해당 필드를 update 합니다.
    private void alterFieldCurrentDay(MongoTemplate template, String key){
        Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
        Update update = new Update();
        update.currentDate(key);
        template.updateFirst(query, update, "컬렉션");		
    }	

    //있으면 아무런 행위를 안하고, 없으면 데이터를 넣어주는 addToSet
    private void addToSet(MongoTemplate template){
        Query query = new Query().addCriteria(Criteria.where( "_id" ).is( new ObjectId("5ebca942fe4f731b463ed94f")) );
        Update update = new Update();
        update.addToSet("my_array", "a");  //my_array라는 배열에 a값이 없으면 넣어주고, 있으면 아무런 행위를 안한다.
        template.updateFirst(query, update, "컬렉션");		
    }	
}

 

이상으로 Mongotemplate을 활용하여 몽고db와 관련된 다양한 update 방법을 살펴보았습니다.

궁금한점, 문의하실 내용은 댓글 또는 메일로 연락주세요!

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글