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"));
}
}
}