필터 빌더
개요
이 가이드에서는 빌더 를 사용하여 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( 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( 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 을 지원합니다. | |
지점에 근접한 지리 공간적 객체입니다. 지리 공간적 공간 인덱스가 필요합니다. 2dsphere 및 2d 인덱스는 $near 를 지원합니다. | |
구체의 한 지점에 근접한 지리 공간적 객체입니다. 지리 공간적 공간 인덱스가 필요합니다. 2dsphere 및 2d 인덱스는 $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( 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]}})