문서 메뉴
문서 홈
/ / /
Kotlin 코루틴
/ /

필터 빌더

이 페이지의 내용

  • 개요
  • 비교
  • 논리
  • 배열
  • 요소
  • 평가
  • 비트 단위
  • 지리 공간

이 가이드에서는 빌더 를 사용하여 MongoDB 코틀린(Kotlin) 드라이버에서 쿼리에 대한 필터 를 지정하는 방법을 배울 수 있습니다.

빌더는 BSON 객체를 구성하는 데 도움이 되는 MongoDB Kotlin 드라이버에서 제공하는 클래스입니다. 자세한 내용 은 빌더 가이드를 참조하세요.

필터는 지정된 조건을 기반으로 쿼리 결과를 제한하는 데 사용되는 작업입니다. 필터는 컬렉션의 검색 조건과 일치하는 정보를 찾는 데 유용한 도구입니다.

다음과 같은 위치에서 필터를 사용할 수 있습니다.

  • find() 메서드에 대한 매개변수로 사용

  • 집계 파이프라인의 일치 단계에서

  • deleteOne() 또는 deleteMany() 메서드에 대한 매개변수로 사용

  • updateOne() 또는 updateMany() 메서드에 대한 매개변수로 사용

필터를 사용한 쿼리 결과의 몇 가지 예는 다음과 같습니다.

  • 가격이 $0 초과 $25 미만인 품목입니다.

  • 글루텐이 없고 칼로리가 500칼로리 미만인 음식입니다.

  • "매운" 을 언급한 음식 비평가 리뷰.

이 가이드에서는 다음 연산자 유형의 예를 통해 빌더를 사용하는 방법을 보여줍니다.

  • 비교

  • 논리

  • 배열

  • 요소

  • 평가

  • 비트 단위

  • 지리 공간

Filters 클래스는 모든 MongoDB 쿼리 연산자에 대한 정적 팩토리 메서드를 제공합니다. 각 메서드는 쿼리 필터가 필요한 모든 메서드에 전달할 수 있는 BSON 유형의 인스턴스를 반환합니다.

간결성을 위해 필터 클래스의 모든 메서드를 정적으로 가져오도록 선택할 수 있습니다.

import com.mongodb.client.model.Filters.*

이 가이드의 Filter 예시 대부분은 다음 샘플 컬렉션 paints를 사용합니다.

{ "_id": 1, "color": "red", "qty": 5, "vendor": ["A"] }
{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 3, "color": "blue", "qty": 8, "vendor": ["B", "A"] }
{ "_id": 4, "color": "white", "qty": 6, "vendor": ["D"] }
{ "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }
{ "_id": 7, "color": "green", "qty": 8,"vendor": ["B", "C"] }
{ "_id": 8, "color": "orange", "qty": 7, "vendor": ["A", "D"] }

paints collection의 이러한 문서는 Kotlin 드라이버와 함께 사용하기 위해 다음 데이터 클래스에 의해 모델링되었습니다.

data class PaintOrder(
@BsonId val id: Int,
val qty: Int,
val color: String,
val vendors: List<String> = mutableListOf()
)

비교 필터에는 문서의 값을 지정된 값과 비교하는 모든 연산자가 포함됩니다.

Filters 비교 연산자 메서드에는 다음이 포함됩니다.

비교 메서드
경기
지정된 값과 동일한 값.
값을 지정된 값보다 크게 설정합니다.
지정된 값과 더 크거나 동일한 값.
지정된 값보다 더 작은 값.
지정된 값보다 더 작거나 동일한 값.
지정된 값과 같지 않은 값입니다.
배열에 지정된 값 중 하나
배열에 지정된 값이 없습니다.
모든 문서.

다음 예제에서는 paints 컬렉션에서 qty 필드 값이 '5'인 모든 문서와 일치하는 필터를 만듭니다:

val equalComparison = Filters.eq(PaintOrder::qty.name, 5)
val resultsFlow = collection.find(equalComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=1, qty=5, color=red, vendors=[A])
PaintOrder(id=6, qty=5, color=pink, vendors=[C])

다음 예제에서는 paints 컬렉션에서 qty 필드의 값이 '10'보다 크거나 같은 모든 문서와 일치하는 필터를 만듭니다.

val gteComparison = Filters.gte(PaintOrder::qty.name, 10)
val resultsFlow = collection.find(gteComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D])
PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B])

다음 예제에서는 조건자(predicate)가 비어 있으므로 paints 컬렉션의 모든 문서와 일치하는 필터를 만듭니다.

val emptyComparison = Filters.empty()
val resultsFlow = collection.find(emptyComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=1, qty=5, color=red, vendors=[A])
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D])
PaintOrder(id=3, qty=8, color=blue, vendors=[B, A])
PaintOrder(id=4, qty=6, color=white, vendors=[D])
PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B])
PaintOrder(id=6, qty=5, color=pink, vendors=[C])
PaintOrder(id=7, qty=8, color=green, vendors=[B, C])
PaintOrder(id=8, qty=7, color=orange, vendors=[A, D])

논리 연산자는 지정된 메서드의 조건에 따라 논리 연산을 수행합니다.

Filters 논리 연산자 메서드에는 다음이 포함됩니다.

로직 메서드(Logical Method)
경기
모든 필터의 조건이 적용된 문서. 이 연산자는 AND 로직으로 필터를 결합합니다.
문서에 두 필터의 조건을 모두 적용합니다. 이 연산자는 논리 OR(으)로 필터를 결합합니다.
필터와 일치하지 않는 문서
두 필터 모두에 일치하지 않는 문서입니다. 이 연산자는 논리적 NOR으로 필터를 결합합니다.

다음 예제에서는 paints 컬렉션에서 qty 필드 값이 '8'보다 크거나 color 필드 값이 'pink'인 문서와 일치하는 필터를 만듭니다.

val orComparison = Filters.or(
Filters.gt(PaintOrder::qty.name, 8),
Filters.eq(PaintOrder::color.name, "pink")
)
val resultsFlow = collection.find(orComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D])
PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B])
PaintOrder(id=6, qty=5, color=pink, vendors=[C])

배열 연산자는 문서의 배열 필드를 평가합니다.

Filters 배열 연산자 메서드에는 다음이 포함됩니다.

배열 메서드
경기
배열 필드에 쿼리에 지정된 모든 요소가 포함된 경우 문서입니다.
배열 필드의 요소가 지정된 모든 조건과 일치하는 문서.
배열 필드가 지정된 수의 요소인 경우 문서입니다.

다음 예시는 paints collection에 'A'와 'D'가 모두 포함된 vendors 배열이 있는 문서와 일치합니다.

val search = listOf("A", "D")
val allComparison = Filters.all(PaintOrder::vendors.name, search)
val resultsFlow = collection.find(allComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=8, qty=7, color=orange, vendors=[A, D])

요소 연산자는 지정된 필드의 특성을 평가합니다.

Filters 요소 연산자 메서드에는 다음이 포함됩니다.

요소 메서드
경기
지정된 필드가 있는 문서.
필드가 지정된 유형인 문서.

다음 예제는 paints 컬렉션에서 qty 필드의 값이 '5'나 '8'이 아닌 문서를 일치합니다.

val existsComparison = Filters.and(Filters.exists(PaintOrder::qty.name), Filters.nin("qty", 5, 8))
val resultsFlow = collection.find(existsComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D])
PaintOrder(id=4, qty=6, color=white, vendors=[D])
PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B])
PaintOrder(id=8, qty=7, color=orange, vendors=[A, D])

평가 연산자는 문서에 있는 모든 필드의 값을 평가합니다.

Filters 평가 연산자 메서드에는 다음이 포함됩니다.

평가 방법
경기
필드 값에 대한 모듈로 연산에 지정된 결과가 포함된 문서.
값에 지정된 일반 표현식이 포함된 문서.
지정된 전체 텍스트 검색 표현식을 포함하는 문서.
지정된 JavaScript 표현식이 포함된 문서.

다음 예시는 paints collection에 문자 'p'로 시작하는 color 필드가 있는 문서와 일치합니다.

val regexComparison = Filters.regex(PaintOrder::color.name, "^p")
val resultsFlow = collection.find(regexComparison)
resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D])
PaintOrder(id=6, qty=5, color=pink, vendors=[C])

비트 연산자는 숫자를 2진 값으로 변환하여 비트를 평가합니다.

Filters 비트 연산자 메서드에는 다음이 포함됩니다.

비트(Bitwise) 메서드
경기
필드의 지정된 비트가 설정된 문서(즉, '1').
필드의 지정된 비트가 해제된 문서(즉, '0').
필드의 지정된 비트 중 하나 이상이 설정된 문서(즉, '1').
필드의 지정된 비트 중 하나 이상이 명확한 문서(즉, "0")입니다.

다음 예제에서는 해당 비트 마스크 '34'의 위치에 비트가 설정된 decimalValue 필드가 있는 문서를 일치시킵니다(즉, '00100010') 이 binary_numbers 컬렉션에 있습니다.

{ "_id": 9, "decimalValue": 54, "binaryValue": "00110110" }
{ "_id": 10, "decimalValue": 20, "binaryValue": "00010100" }
{ "_id": 11, "decimalValue": 68, "binaryValue": "1000100" }
{ "_id": 12, "decimalValue": 102, "binaryValue": "01100110" }
data class BinaryNumber(
@BsonId val id: Int,
val decimalValue: Int,
val binaryValue: String
)
val binaryCollection = database.getCollection<BinaryNumber>("binary_numbers")
val bitmask = 34.toLong() // 00100010 in binary
val bitsComparison = Filters.bitsAllSet(BinaryNumber::decimalValue.name, bitmask)
val resultsFlow = binaryCollection.find(bitsComparison)
resultsFlow.collect { println(it) }
BinaryNumber(id=1, decimalValue=54, binaryValue=00110110)
BinaryNumber(id=4, decimalValue=102, binaryValue=01100110)

지리 공간적 연산자는 지정된 좌표와 모양 또는 위치와의 관계를 평가합니다.

Filters 지리 공간적 연산자 메서드에는 다음이 포함됩니다.

지리 공간적 메서드
경기
GeoJSON 도형(geometry) 값이 GeoJSON 도형 경계 내에 속하는 문서입니다.
지정된 상자 내에 존재하는 좌표 값이 포함된 문서입니다.
지정된 다각형 내에 존재하는 좌표 값을 포함하는 문서입니다.
지정된 원 안에 존재하는 좌표 값이 포함된 문서입니다.
구형 도형을 사용하는 지정된 원 내에 존재하는 지리 공간적 데이터 값(GeoJSON 또는 레거시 좌표 쌍)을 포함하는 도형입니다.
GeoJSON 도형과 교차하는 도형입니다. 2dsphere 인덱스는 $geoIntersects을 지원합니다.
지점에 근접한 지리 공간적 객체입니다. 지리 공간적 공간 인덱스가 필요합니다. 2dsphere2d 인덱스는 $near를 지원합니다.
구체의 한 지점에 근접한 지리 공간적 객체입니다. 지리 공간적 공간 인덱스가 필요합니다. 2dsphere2d 인덱스는 $nearSphere를 지원합니다.

다음 예에서는 이 stores 컬렉션의 지정된 다각형 내에 속하는 GeoJSON 도형이 point 필드에 포함된 문서와 일치하는 필터를 만듭니다.

{ "_id": 13, "coordinates": { "type": "Point", "coordinates": [2.0, 2.0] } }
{ "_id": 14, "coordinates": { "type": "Point", "coordinates": [5.0, 6.0] } }
{ "_id": 15, "coordinates": { "type": "Point", "coordinates": [1.0, 3.0] } }
{ "_id": 16, "coordinates": { "type": "Point", "coordinates": [4.0, 7.0] } }
data class Store(
@BsonId val id: Int,
val name: String,
val coordinates: Point
)
val collection = database.getCollection<Store>("stores")
val square = Polygon(listOf(
Position(0.0, 0.0),
Position(4.0, 0.0),
Position(4.0, 4.0),
Position(0.0, 4.0),
Position(0.0, 0.0)))
val geoWithinComparison = Filters.geoWithin(Store::coordinates.name, square)
val resultsFlow = collection.find(geoWithinComparison)
resultsFlow.collect { println(it) }
Store(id=13, name=Store 13, coordinates=Point{coordinate=Position{values=[2.0, 2.0]}})
Store(id=15, name=Store 15, coordinates=Point{coordinate=Position{values=[1.0, 3.0]}})

돌아가기

집계 빌더

다음

인덱스 빌더