Docs Menu

フィルター ビルダ

このガイドでは、 ビルダ を使用して MongoDB Java ドライバーでクエリのフィルターを指定する方法を学びます。

ビルダは MongoDB Java ドライバーによって提供されるクラスで、 BSONオブジェクトの構築に役立ちます。 詳細については、ビルダに関するガイド をご覧ください。

フィルターは、必要な結果のみを表示するよう制限する際に MongoDB で使用する操作です。

フィルターを使用する場所は次のとおりです。

  • find()

  • 集計のマッチステージ

  • deleteOne()/deleteMany()

  • updateOne()/updateMany()

以下にフィルタを使ったクエリ結果の例を挙げます。

  • 0~25ドルのアイテム

  • 屋内スイミングプールや無料駐車場などの設備があるホテル

  • 「辛い(spicy)」と言及した料理評論家のレビュー

このガイドでは、次のタイプの演算子の例を使用してビルダを使用する方法を説明します。

Filtersクラスは、すべての MongoDB クエリ演算子の静的ファクトリー メソッドを提供します。各メソッドは BSON 型のインスタンスを返します。このインスタンスは、クエリ フィルターを必要とする任意のメソッドに渡すことができます。

Tip

簡潔にするために、Filters クラスのすべてのメソッドを静的にインポートすることを選択できます。

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

次の例では、この静的インポートを前提としています。

このガイドのフィルターの例では、次のサンプル コレクションを使用します。

コレクション: paint_purchases

{ "_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"] }

コレクション: binary_numbers

{ "_id": 9, "a": 54, "binaryValue": "00110110" }
{ "_id": 10, "a": 20, "binaryValue": "00010100" }
{ "_id": 11, "a": 68, "binaryValue": "1000100" }
{ "_id": 12, "a": 102, "binaryValue": "01100110" }

コレクション: geo_points

{ "_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] } }

比較フィルターには、ドキュメント内の値を指定された値と比較するすべての演算子が含まれます。

比較演算子のメソッドには、次のものがあります。

比較メソッド
マッチ

指定した値と等しい値。

指定した値より大きい値。

指定した値以上の値。

指定した値より小さい値。

指定した値以下の値。

指定した値と等しくない値。

配列で指定された任意の値。

配列で指定された値をすべて除外。

すべてのドキュメント。

次の例では、 paint_purchasesコレクション内のqtyフィールドの値が 5 に等しいすべてのドキュメントに一致するフィルターが作成されます。

Bson equalComparison = eq("qty", 5);
collection.find(equalComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 1, "color": "red", "qty": 5, "vendor": ["A"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }

次の例では、 paint_purchasesコレクション内のqtyフィールドの値が 10 以上であるすべてのドキュメントに一致するフィルターが作成されます。

Bson gteComparison = gte("qty", 10);
collection.find(gteComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] }

次の例では、述語が空であるため、paint_purchases コレクション内のすべてのドキュメントに一致するフィルターが作成されます。

Bson emptyComparison = empty();
collection.find(emptyComparison).forEach(doc -> System.out.println(doc.toJson()));

先述のクエリの出力は、コレクション内のすべてのドキュメントで構成されます。

{ "_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"] }
...

論理演算子は、指定されたメソッドの条件に基づいて論理演算を行います。

論理演算子のメソッドには、次のものがあります。

論理メソッド
マッチ

すべてのフィルターの条件を持つドキュメント。この演算子は論理的なAND でフィルターを結合します。

いずれかのフィルターの条件を持つドキュメント。この演算子は論理的なOR でフィルターを結合します。

フィルターに一致しないドキュメント。

どちらのフィルターにも一致しないドキュメント。この演算子は論理的なNOR でフィルターを結合します。

次の例では、paint_purchases コレクション内で qty フィールドの値が 8 より大きいか、またはcolor フィールドの値が "pink" と等しいドキュメントに一致するフィルターを作成します。

Bson orComparison = or(gt("qty", 8), eq("color", "pink"));
collection.find(orComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }

配列演算子は、ドキュメント内の配列フィールドを評価します。

配列演算子のメソッドには、次のものがあります。

配列メソッド
マッチ

配列フィールドがクエリで指定されたすべての要素を含んでいるドキュメント。

配列フィールド内の要素が指定されたすべての条件に一致するドキュメント。

配列フィールドが指定された数の要素であるドキュメント。

次の例では、paint_purchases コレクションで "A" と "D" の両方を含む vendors 配列のドキュメントを照合します。

List<String> search = Arrays.asList("A", "D");
Bson allComparison = all("vendor", search);
collection.find(allComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 8, "color": "orange", "qty": 7, "vendor": ["A", "D"] }

要素演算子は指定されたフィールドの性質を評価します。

要素演算子ののメソッドは以下の通りです。

要素メソッド
マッチ

指定したフィールドを持つドキュメント。

フィールドが指定された型であるかどうかのドキュメント。

次の例では、paint_purchases コレクション内で、qty フィールドを持ち、その値が 5 または 8 と等しくないドキュメントを検索します。

Bson existsComparison = and(exists("qty"), nin("qty", 5, 8));
collection.find(existsComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

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

評価演算子は、ドキュメント内の任意のフィールドの値を評価します。

評価演算子のメソッドには、次のものがあります。

評価メソッド
マッチ

フィールド値に対する剰余演算によって指定された結果が生成されるドキュメント。

値に指定された正規表現が含まれているドキュメント。

指定した全文検索式を含むドキュメント。

指定された JavaScript 式を含むドキュメント。

次の例では、paint_purchases コレクション内でcolor "p"の文字から始まるフィールドを持つドキュメントを検索します。

Bson regexComparison = regex("color", "^p");
collection.find(regexComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }

ビット演算子は数値をバイナリ値に変換し、そのビットを評価します。

ビット演算子のメソッドには、次のものがあります。

ビットメソッド
マッチ

フィールドの指定されたビットが設定されているドキュメント(つまり"1")。

フィールドの指定されたビットがクリアされているドキュメント(すなわち "0")。

あるフィールドの指定されたビットの少なくとも1つがセットされているドキュメント(すなわち "1")。

フィールドの指定されたビットの少なくとも1つがクリアされているドキュメント(すなわち "0")。

次の例では、bitField フィールドのあるドキュメントと、対応するビットマスク "34" の位置にビットが設定されているドキュメントを照合します (つまり binary_numbersコレクション内の "00100010" です:

Bson bitsComparison = bitsAllSet("a", 34);
collection.find(bitsComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 9, "a": 54, "binaryValue": "00110110" }
{ "_id": 12, "a": 102, "binaryValue": "01100110" }

地理空間演算子は、指定された座標と、その形状または場所との関係を評価します。

地理空間演算子のメソッドには、次のものがあります。

地理空間メソッド
マッチ

境界となる GeoJSON ジオメトリに含まれる GeoJSON ジオメトリ値を含むドキュメント。

指定したボックス内に存在する座標値を含むドキュメント。

指定した多角形内に存在する座標値を含むドキュメント。

指定した円内に存在する座標値を含むドキュメント。

指定された円内に存在する地理空間データ値(GeoJSON またはlegacy coordinate pairs)を含むジオメトリ。球状ジオメトリを使用。

GeoJSON ジオメトリと交差するジオメトリ。2dsphereインデックスは$geoIntersectsをサポートします。

点に近接する地理空間オブジェクト。地理空間インデックスが必要です。2dsphere および2dインデックスは$near をサポートします。

球上の点に近接する地理空間オブジェクト。地理空間インデックスが必要です。2dsphere および2dインデックスは$nearSphere をサポートします。

次の例では、 pointフィールドに、 geo_pointsコレクション内の特定の多角形に含まれる GeoJSON ジオメトリが含まれるドキュメントに一致するフィルターが作成されます。

Polygon square = new Polygon(Arrays.asList(new Position(0, 0),
new Position(4, 0),
new Position(4, 4),
new Position(0, 4),
new Position(0, 0)));
// Prints documents that contain "coordinates" values that are within the bounds of the polygon passed as the filter parameter
Bson geoWithinComparison = geoWithin("coordinates", square);
collection.find(geoWithinComparison).forEach(doc -> System.out.println(doc.toJson()));

次に、前のクエリの出力を示します。

{ "_id": 13, "coordinates": {"type": "Point", "coordinates": [2.0, 2.0]} }
{ "_id": 15, "coordinates": {"type": "Point", "coordinates": [1.0, 3.0]} }