フィルター ビルダ
Overview
このガイドでは、ビルダを使用して MongoDB Kotlin ドライバーでクエリのフィルターを指定する方法を学びます。
ビルダは MongoDB Kotlin ドライバーによって提供されるクラスで、 BSONオブジェクトの構築に役立ちます。 詳細については、ビルダに関するガイド をご覧ください。
フィルターは、指定された条件に基づいてクエリの結果を制限するために使用される操作です。 フィルターは、コレクション内の検索条件に一致する情報を見つけるのに役立つツールです。
フィルターは、次の場所で使用できます。
find()
メソッドへのパラメータとして集計パイプラインのマッチステージにおいて
メソッドまたは メソッドのパラメータとして
deleteOne()
deleteMany()
メソッドまたは メソッドのパラメータとして
updateOne()
updateMany()
以下にフィルタを使ったクエリ結果の例を挙げます。
0 ドル以上で 25 未満のアイテム。
グループ化された
「辛い(spicy)」と言及した料理評論家のレビュー。
このガイドでは、次のタイプの演算子の例を使用してビルダを使用する方法を説明します。
Filters
クラスは、すべての MongoDB クエリ演算子の静的ファクトリー メソッドを提供します。各メソッドは BSON 型のインスタンスを返します。このインスタンスは、クエリ フィルターを必要とする任意のメソッドに渡すことができます。
Tip
簡潔にするために、Filters クラスのすべてのメソッドを静的にインポートすることを選択できます。
import com.mongodb.client.model.Filters.*
このガイドのFilters
の例のほとんどでは、次のサンプル コレクション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
コレクション内のこれらのドキュメントは、 Kotlin ドライバーで使用するために次のデータ クラスによってモデル化されます。
data class PaintOrder( val id: Int, val qty: Int, val color: String, val vendors: List<String> = mutableListOf() )
Tip
ビルダ メソッドとデータ クラスのプロパティ
任意のKotlinドライバー拡張の依存関係をアプリケーションに追加することで、ビルダ クラスのメソッドをデータクラスプロパティで直接使用できます。 詳細と例については、「 データ クラスを使用したビルダの使用 」ガイドを参照してください。
比較
比較フィルターには、ドキュメント内の値を指定された値と比較するすべての演算子が含まれます。
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])
次の例では、述語が空であるため、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
論理演算子のメソッドには、次のものがあります。
論理メソッド | マッチ |
---|---|
すべてのフィルターの条件を持つドキュメント。この演算子は論理的な | |
いずれかのフィルターの条件を持つドキュメント。この演算子は論理的な | |
フィルターに一致しないドキュメント。 | |
どちらのフィルターにも一致しないドキュメント。この演算子は論理的な |
次の例では、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
コレクションで "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
コレクション内でcolor
"p"の文字から始まるフィールドを持つドキュメントを検索します。
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])
Bitwise
ビット演算子は数値をバイナリ値に変換し、そのビットを評価します。
Filters
ビット演算子のメソッドには、次のものがあります。
ビットメソッド | マッチ |
---|---|
フィールドの指定されたビットが設定されているドキュメント(つまり"1")。 | |
フィールドの指定されたビットがクリアされているドキュメント(すなわち "0")。 | |
あるフィールドの指定されたビットの少なくとも1つがセットされているドキュメント(すなわち "1")。 | |
フィールドの指定されたビットの少なくとも1つがクリアされているドキュメント(すなわち "0")。 |
次の例では、 フィールドが対応するビットマスク "34" の位置にビットが設定されているドキュメントを照合しdecimalValue
(つまり このbinary_numbers
コレクション内の "00100010" です:
{ "_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 ジオメトリに含まれる GeoJSON ジオメトリ値を含むドキュメント。 | |
指定したボックス内に存在する座標値を含むドキュメント。 | |
指定した多角形内に存在する座標値を含むドキュメント。 | |
指定した円内に存在する座標値を含むドキュメント。 | |
指定された円内に存在する地理空間データ値(GeoJSON またはlegacy coordinate pairs)を含むジオメトリ。球状ジオメトリを使用。 | |
GeoJSON ジオメトリと交差するジオメトリ。 | |
点に近接する地理空間オブジェクト。地理空間インデックスが必要です。 | |
球上の点に近接する地理空間オブジェクト。地理空間インデックスが必要です。 |
次の例では、 point
フィールドに、このstores
コレクション内の特定の多角形に含まれる GeoJSON ジオメトリが含まれているドキュメントに一致するフィルターが作成されます。
{ "_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]}})