クエリを指定する
Overview
このガイドでは、 Java Reactive Streams ドライバーを使用してクエリを指定する方法を学習できます。
重要
プロジェクトリ アクター ライブラリ
このガイドでは、プロジェクトPublisher
Reactive ライブラリを使用して、 Java Reactive Streams ドライバー メソッドによって返された インスタンスを消費します。プロジェクト Reactor ライブラリとその使用方法の詳細については、React ドキュメントの はじめに を参照してください。このガイドでは、プロジェクト Reactor ライブラリ メソッドの使用方法の詳細については、「 MongoDBへのデータの書込み 」ガイドを参照してください。
このガイドでは、プロジェクト React ライブラリのPublisher
実装であるFlux Publisher
を使用します。 Java Reactive Streams では、アプリケーションでのデータ送信方法を制御するにはPublisher
実装を使用する必要があります。 Flux
クラスの詳細については、 Flux を参照してください プロジェクト React のドキュメントを参照してください。
クエリフィルターを作成することで、クエリが返すドキュメントのセットを絞り込むことができます。 クエリフィルター は、MongoDB が読み取りまたは書込み (write) 操作でドキュメントを照合するために使用する検索条件を指定する 式 です。 クエリフィルターでは、クエリに完全に一致するドキュメントを検索するようにドライバーに指示することも、より複雑な一致条件をExpressするためにクエリフィルターを作成することもできます。
サンプル データ
このガイドの例では、次のドキュメントを含むfruits
というコレクションに対して操作を実行します。
{ "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" },
次のコード例は、データベースとコレクションを作成し、サンプル ドキュメントをコレクションに挿入する方法を示しています。
import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.ServerApi; import com.mongodb.ServerApiVersion; import com.mongodb.client.result.InsertManyResult; import org.bson.Document; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.reactivestreams.client.MongoCollection; import java.util.Arrays; import java.util.List; public class QueryDatabase { public static void main(String[] args) { // Replace the placeholder with your Atlas connection string String uri = "<connection string>"; // Construct a ServerApi instance using the ServerApi.builder() method ServerApi serverApi = ServerApi.builder() .version(ServerApiVersion.V1) .build(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)) .serverApi(serverApi) .build(); // Create a new client and connect to the server try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("sample_fruits"); MongoCollection<Document> fruits = database.getCollection("fruits"); Document document1 = new Document("_id", "1") .append("name", "apples") .append("qty", 5) .append("rating", 3) .append("color", "red") .append("type", Arrays.asList("fuji", "honeycrisp")); Document document2 = new Document("_id", "2") .append("name", "bananas") .append("qty", 7) .append("rating", 4) .append("color", "yellow") .append("type", Arrays.asList("cavendish")); Document document3 = new Document("_id", "3") .append("name", "oranges") .append("qty", 6) .append("rating", 2) .append("type", Arrays.asList("naval", "mandarin")); Document document4 = new Document("_id", "4") .append("name", "pineapple") .append("qty", 3) .append("rating", 5) .append("color", "yellow"); List<Document> documents = Arrays.asList(document1, document2, document3, document4); Publisher<InsertManyResult> insertPublisher = fruits.insertMany(documents); Mono.from(insertPublisher).block(); } } }
完全一致
リテラル値クエリは、クエリフィルターに完全に一致するドキュメントを返します。 完全一致のドキュメントを返すには、 eq()
比較演算子メソッドを使用します。
次の例では、 find()
メソッドのクエリフィルターパラメータとしてeq()
比較演算子のメソッドを指定しています。 このコードは、 color
フィールドの値が"yellow"
であるすべてのドキュメントを返します。
FindPublisher<Document> findDocPublisher = fruits.find(eq("color", "yellow")); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Tip
すべてのドキュメントの検索
コレクション内のすべてのドキュメントを検索するには、パラメータを指定せずにfind()
メソッドを呼び出します。 次の例では、コレクション内の すべての ドキュメントを検索しています。
FindPublisher<Document> findDocPublisher = fruits.find(); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
比較演算子
比較演算子は、ドキュメントフィールド値をクエリフィルター内の指定された値に対して評価します。 以下は、一般的な比較演算子のメソッドのリストです。
gt()
: より大きいlte()
: 以下ne()
: 等しくない
演算子の完全なリストを表示するには、 マニュアルの「 比較クエリ演算子 MongoDB Server」ガイドを参照してください。
次の例では、クエリフィルター内のgt()
比較演算子のメソッドをfind()
メソッドへのパラメーターとして指定します。 コードは、 rating
フィールドの値が2
より大きいすべてのドキュメントを返します。
FindPublisher<Document> findDocPublisher = fruits.find(gt("rating", 2)); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
論理演算子
論理演算子は、2 つ以上の式のセットの結果に適用されたロジックを使用してドキュメントを一致させます。 以下は、論理演算子のメソッドのリストです。
and()
は、すべての句の条件に一致するすべてのドキュメントを返します。or()
は、 1 つの句の条件に一致するすべてのドキュメントを返しますnor()
は、どの句の条件にも一致しないすべてのドキュメントを返します。not()
は、式に一致しないすべてのドキュメントを返します。
論理演算子の詳細については、 MongoDB Serverマニュアルの「 論理クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルター内のor()
論理演算子のメソッドをfind()
メソッドへのパラメーターとして指定します。 このコードは、 5
より大きいqty
フィールド値または"yellow"
のcolor
フィールド値を持つすべてのドキュメントを返します。
FindPublisher<Document> findDocPublisher = fruits.find( or(gt("qty", 5), eq("color", "yellow"))); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
配列演算子
配列演算子は、 配列フィールド内の要素の値または量に基づいてドキュメントを一致させます。 以下は、使用可能な配列演算子のメソッドの一覧です。
all()
は、クエリ内のすべての要素を含む配列を持つドキュメントを返しますelemMatch()
は、配列フィールド内の要素がクエリ内のすべての条件に一致する場合にドキュメントを返します。size()
は、指定されたサイズの配列を持つすべてのドキュメントを返します
配列演算子の詳細については、MongoDB Server マニュアルの「 配列クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルター内のsize()
配列演算子のメソッドをfind()
メソッドへのパラメーターとして指定します。 このコードは、type
2
要素を含む 配列フィールドを持つすべてのドキュメントを返します。
FindPublisher<Document> findDocPublisher = fruits.find(size("type", 2)); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}
要素演算子
要素演算子は、フィールドの存在または型に基づいてデータをクエリします。 次は、使用可能な要素演算子のメソッドの一覧です。
exists()
は、指定されたフィールドを持つドキュメントを返しますtype()
は、フィールドが指定された型である場合にドキュメントを返します。
要素演算子の詳細については、 MongoDB Serverマニュアルの「 要素クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルター内のexists()
要素演算子のメソッドをfind()
メソッドへのパラメーターとして指定します。 このコードでは、 color
フィールドを持つすべてのドキュメントが返されます。
FindPublisher<Document> findDocPublisher = fruits.find(exists("color", true)); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
評価演算子
評価演算子は、個々のフィールドまたはコレクションのドキュメント全体の評価に基づいてデータを返します。 以下は、一般的な評価演算子のメソッドのリストです。
text()
は、ドキュメントに対してテキスト検索を実行しますregex()
は、指定された正規表現に一致するドキュメントを返します
評価演算子の完全なリストを表示するには、 マニュアルの「 評価クエリ演算子MongoDB Server 」ガイドを参照してください。
次の例では、クエリフィルター内のregex()
評価演算子のメソッドをfind()
メソッドへのパラメーターとして指定します。 このコードでは正規式を使用して、少なくとも 2 文字の連続した"p"
文字を持つname
フィールド値を持つすべてのドキュメントが返されます。
FindPublisher<Document> findDocPublisher = fruits.find(regex("name", "p{2,}")); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
詳細情報
ドキュメントのクエリの詳細については、MongoDB Server マニュアルの 「ドキュメントのクエリ」 ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。