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

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

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


몽고DB/Java 몽고DB

MongoTemplate or연산자를 통한 질의문 만들기(MongoTemplate or query)

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

몽고 템플릿을 활용한 or가 필요한 질의문 작성 방법입니다.

아래와 같은 데이터베이스의 컬렉션이 존재한다고 하겠습니다.

 

일반적인 질의문은 number가 "조건" 이면, text가 "조건" 이면 이러한 방식으로 되어 있습니다.

그런데 간혹 1개의 도큐먼트를 대상으로 질의문이 여러개가 필요할 때가 있습니다.

예를들어 text의 값이 ab를 포함하고 있거나, ef를 포함하고 있거나 아니면 hi를 포함하고 있는 경우에 대한 질의문 입니다.

일반적으로 아래처럼 질의문을 작성하고 오류를 만나게 됩니다. ^^;

"같은 값에 뭐하는 짓인지" 라는 오류인 것 같습니다..ㅠ

 

단순하게 직관적으로 보면 크게 문제가 없는 질의문인데 같은 도큐먼트 대상으로 위 사진처럼 질의를 하게되면 동작하지가 않습니다.

이럴 때 필요한 것이 Criteria 클래스에서 제공하여 주는 orOperator 메소드 입니다.

질의를 할 내용을 배열형식으로 채워준 뒤에 orOperator메소드를 활용하면 질의문이 이쁘게(?) 만들어지게 됩니다.

import java.util.List;

import org.bson.Document;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

public class MongoTesterClass{

    public static MongoTemplate template;
	
    public static void testMethod() {
		
        Query query = new Query();
        Criteria criteria = new Criteria();

        String ask_list[] = {"ab","ef","hi"};
        Criteria criteria_arr[]  = new Criteria[ask_list.length];  //배열을 만들어줍니다.
		
        for(int i = 0;i < ask_list.length;i++){
            String question = ask_list[i];
            criteria_arr[i] = Criteria.where("text").regex(question); //질의문을 담아둡니다.
        }		
        query.addCriteria( criteria.orOperator(criteria_arr) );//해당 배열을 orOperator 메소드로 묶습니다.
		
        List<Document> list = template.find(query, Document.class, "test_collection");
        list.forEach(System.out::println);
    }

}

 

위 샘플코드처럼 질의할 쿼리를 담는 Criteria 배열과 배열을 묶을 Criteria를 2가지로 분리를 해야 합니다.

같은 값에 대해서 다양한 case로 질문을 하려면 배열로 질의를 생성하는 것이 내용의 핵심입니다.

결과가 잘 나옴을 알 수 있습니다.

 

간혹 아래처럼 체이닝 형식으로 조건을 이어서 붙이는 경우가 있습니다.

import java.util.List;

import org.bson.Document;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

public class MongoTesterClass{

    public static MongoTemplate template;
	
    public static void testMethod() {
        Query query = new Query();
        query.addCriteria(Criteria.where("text").regex("ab").regex("ef").regex("hi"));
        List<Document> list = template.find(query, Document.class, "test_collection");
        list.forEach(System.out::println);
    }

}

 

이럴 경우에 가장 마지막에 질의한 항목인 "hi" 값이 있는지(regex)에 대한 조건만 동작하게 됩니다.

1개의 결과만 나오는군요!

 

기존의 질의했던 내용이 사라지고 마지막 1개만 적용되는 것을 볼 수 있습니다.

체이닝 형식으로 같은 메소드를 계속해서 불러오면 덮어씌우기 현상이 발생하기 때문 입니다.

 

이상으로 몽고 템플릿을 활용하여 같은 도큐먼트(Document)의 값에 대해서 여러 개의 질의문을 추가하여 동작시키는 방법에 대해서 살펴 보았습니다. ^^

 

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

댓글