Skip to content

7.필터 빌더(Filters)#

Filters 유틸리티 클래스를 사용하면 JSON 문자열 없이 안전하게 필터를 생성할 수 있다.

비교 연산자#

메서드 MongoDB 연산자 설명
eq(field, value) $eq 같음
ne(field, value) $ne 다름
gt(field, value) $gt 초과
gte(field, value) $gte 이상
lt(field, value) $lt 미만
lte(field, value) $lte 이하

배열/집합 연산자#

메서드 MongoDB 연산자 설명
in(field, values...) $in 값 중 하나와 일치
nin(field, values...) $nin 모든 값과 불일치

논리 연산자#

메서드 MongoDB 연산자 설명
and(filters...) $and 모든 조건 충족
or(filters...) $or 하나 이상 충족
not(filter) $not 조건 부정

필드 존재 확인#

메서드 MongoDB 연산자 설명
exists(field, boolean) $exists 필드 존재 여부

배열 요소 검색#

메서드 MongoDB 연산자 설명
elemMatch(field, condition) $elemMatch 배열 요소 조건 검색

예제: 비교 연산자#

import static com.altibase.document.api.Filters.*;

try (AltibaseCollection users = db.getCollection("users")) {
    // 나이가 30 이상인 사용자
    AltibaseDocument filter = gte("age", 30);

    try (DocResult results = users.findByCond(filter).execute()) {
        for (AltibaseDocument doc : results) {
            System.out.println(doc.getString("name"));
        }
    }
}

예제: IN 연산자#

import static com.altibase.document.api.Filters.*;

// 상태가 "active" 또는 "pending"인 항목
AltibaseDocument filter = in("status", "active", "pending");

// 리스트로 전달
List<String> regions = Arrays.asList("US", "CA", "MX");
AltibaseDocument regionFilter = in("region", regions);

예제: 논리 연산자 조합#

import static com.altibase.document.api.Filters.*;

// (나이 >= 18 AND 나이 <= 65) AND (상태 = "active")
AltibaseDocument filter = and(
    gte("age", 18),
    lte("age", 65),
    eq("status", "active")
);

// 가격이 1000 미만이거나 할인율이 50% 이상
AltibaseDocument saleFilter = or(
    lt("price", 1000),
    gte("discount", 0.5)
);

예제: 필드 존재 확인#

import static com.altibase.document.api.Filters.*;

// deletedAt 필드가 없는 문서 (삭제되지 않은 항목)
AltibaseDocument notDeleted = exists("deletedAt", false);

// 프로필 사진이 있는 사용자
AltibaseDocument hasPhoto = exists("profileImage", true);

예제: 배열 요소 검색#

import static com.altibase.document.api.Filters.*;

// tags 배열에 "bestseller" 또는 "recommended" 포함
AltibaseDocument tagFilter = in("tags", "bestseller", "recommended");

// orders 배열 중 금액이 100000 이상인 주문이 있는 고객
AltibaseDocument orderFilter = elemMatch("orders", gte("amount", 100000));

예제: 정규표현식 검색#

// "John"으로 시작하는 이름
AltibaseDocument filter1 = AltibaseDocument.parse("{\"name\": {\"$regex\": \"^John\"}}");

// 대소문자 무시 옵션
AltibaseDocument filter2 = AltibaseDocument.parse(
    "{\"email\": {\"$regex\": \"gmail\", \"$options\": \"i\"}}"
);

JSON 문자열 vs Filters 비교#

// JSON 문자열 방식
AltibaseDocument filter1 = AltibaseDocument.parse(
    "{\"$and\": [{\"status\": \"active\"}, {\"age\": {\"$gte\": 18}}]}"
);

// Filters 유틸리티 방식 (권장)
AltibaseDocument filter2 = and(
    eq("status", "active"),
    gte("age", 18)
);

JsonPath 조회#

JsonPath 표현식으로 중첩된 JSON 필드를 조회할 수 있다.

try (AltibaseCollection users = db.getCollection("users")) {
    // address.city가 "Seoul"인 사용자
    try (DocResult results = users.findByJsonPath("$.address.city == 'Seoul'").execute()) {
        for (AltibaseDocument doc : results) {
            System.out.println(doc.getString("name"));
        }
    }
}