Docs Menu
Docs Home
/ / /
Rust ドライバー
/ / /

カーソルを使用したデータへのアクセス

項目一覧

  • Overview
  • サンプルデータの例
  • ドキュメントを個別に検索する
  • 組み込みパターン
  • ストリーム実装パターン
  • ドキュメントを配列として取得
  • カーソルの動作を指定する
  • 詳細情報
  • API ドキュメント

このガイドでは、Rust ドライバーを使用して、カーソルを使用して読み取り操作または集計から返されたデータにアクセスする方法を学習します。 カーソルは、特定の時点でメモリ内にドキュメントのサブセットのみを保持しながら、複数のドキュメントを反復処理できるメカニズムです。

ドライバーは、カーソルからドキュメントを検索するために Cursorタイプを提供します。 たとえば、複数のドキュメントを返すことができる検索操作を実行すると、ドライバーはCursorインスタンスを返し、そこから一致したドキュメントにアクセスできます。

読み取り操作または集計を実行すると、返されるCursorインスタンスに操作結果の最初のバッチが含まれます。 カーソルを反復処理すると、サーバーはより個別の結果を返します。 結果のバッチの末尾に到達した後に一致するドキュメントがさらにある場合、すべての結果が返されるまで、 Cursorインスタンスは次のドキュメントのバッチを取得します。

このガイドには、次のセクションが含まれています。

  • 例のサンプル データは、カーソルの例で使用されるサンプル データを示します

  • ドキュメントの取得 では、反復処理またはストリームを使用して一度に 1 つずつ結果にアクセスする方法が個別に説明されます

  • 配列としてのドキュメントを取得では、返されたカーソル結果を収集して、すべての結果を単一の配列としてアクセスする方法について説明します。

  • カーソルの動作を指定するでは、メソッドが返すカーソルを構成する方法について説明します。

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します

このガイドの例では、 構造体に保存されている次のデータを使用します。

let docs = vec! [
Fruit {
name: "strawberry".to_string(),
color: "red".to_string()
},
Fruit {
name: "banana".to_string(),
color: "yellow".to_string()
},
Fruit {
name: "pomegranate".to_string(),
color: "red".to_string()
},
Fruit {
name: "pineapple".to_string(),
color: "yellow".to_string()
}
];

このドライバーは、 Cursorインスタンスによって返されたドキュメントを反復処理するための次のアクセス パターンを提供します。

  • 組み込みパターン: カーソルを進み、現在のドキュメントを検索して逆直列化します

  • ストリーム実装パターン: カーソルを反復処理し、 Streamが提供するメソッドを呼び出して、単一または複数のドキュメントを処理

次のセクションでは、これらのアクセス パターンと対応するメソッドについて詳しく説明します。

ドライバーに組み込まれているアクセス パターンを使用して、ドキュメントを 1 つずつ検索して処理できます。

Cursorタイプには、カーソルを反復処理してドキュメントに個別にアクセスするためのadvance() deserialize_current()メソッドと メソッドが含まれています。

advance()メソッドはカーソルを転送し、ローカル バッファが使い果たされたときにデータベースに詳細な結果を送信します。これはカーソルが結果のバッチの末尾に到達したときに発生します。 カーソルが結果のバッチの末尾に到達するたびに、次のバッチをリクエストします。 カーソルは、返される一致するドキュメントがなくなり、使用できなくなると使い果たされます。 advance()メソッドは、新しい結果が正常に返された場合はtrueの結果を返し、カーソルが閉じられた場合はfalseの結果を返します。

deserialize_current()メソッドは、カーソル内の現在の結果への参照を返し、その結果をカーソルに関連付けられた型に逆直列化します。 型を指定しない限り、メソッドはコレクションが パラメーター化されている型と同じ型を使用します。

重要

advance()メソッドがtrueの結果を返す場合にのみ、 deserialize_current()メソッドを呼び出すことができます。 true結果なしで、または以前にadvance()を呼び出しずにカーソルでdeserialize_current()を呼び出すと、ドライバーはエラーを生成します。

次の例は、このアクセス パターンを実装して、 fruitsコレクションでの検索操作の結果を反復処理する方法を示しています。

let mut cursor = my_coll.find(doc! { "color": "red" }).await?;
while cursor.advance().await? {
println!("{:?}", cursor.deserialize_current()?);
}

ストリームとしてカーソル結果にアクセスして、個々のドキュメントを取得したり、複数のドキュメントを一度に収集したりできます。

Cursor型はStream特権を実装しているため、ストリームとしてカーソルを反復処理できます。 このパターンを使用すると、組み込みパターンよりも簡潔なコードを記述できます。 StreamExt Stream拡張機能は、操作を組み合わせてコードを統合するための多数の機能を提供するためです。

ストリーム パターンを使用するには、次のメソッドを使用できます。

  • next(): カーソルを次の結果に進め、 Option<Result<T>>タイプを返します

  • try_next(): カーソルを次の結果に進め、 Result<Option<T>>タイプを返します

重要

ストリーム パターン メソッドに必要なインポート

next()メソッドを使用するには、 StreamExt特性をインポートする必要があります。 try_next()メソッドを使用するには、 TryStreamExt特性をインポートする必要があります。

次の例は、2 つのストリーム メソッドを実装して、 fruitsコレクションでの検索操作の結果を反復処理する方法を示しています。

let mut cursor = my_coll.find(doc! { "color": "red" }).await?;
println!("Output from next() iteration:");
while let Some(doc) = cursor.next().await {
println!("{:?}", doc?);
}
println!();
let mut cursor = my_coll.find(doc! { "color": "yellow" }).await?;
println!("Output from try_next() iteration:");
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}

Cursor型はStream特権を実装しているため、カーソルからの結果を配列に収集できます。

ドキュメントを配列として取得するには、次のメソッドを使用します。

  • collect(): カーソルからの結果をVec<Result<T>>型に収集します

  • try_collect(): カーソルからの結果をResult<Vec<T>>型に収集します

注意

collect()メソッドを使用するには、 StreamExt特性をインポートする必要があります。 try_collect()メソッドを使用するには、 TryStreamExt特性をインポートする必要があります。

let cursor = my_coll.find(doc! { "color": "red" }).await?;
println!("Output from collect():");
let v: Vec<Result<Fruit>> = cursor.collect().await;
println!("{:?}", v);
println!();
let cursor = my_coll.find(doc! { "color": "yellow" }).await?;
println!("Output from try_collect():");
let v: Vec<Fruit> = cursor.try_collect().await?;
println!("{:?}", v);

警告

アプリケーション メモリ制限の超過を避ける

大規模な結果を配列に変換する ことは避けてください 。 配列が使用可能なアプリケーション メモリのサイズを超えると、アプリケーションがクラッシュする可能性があります。 大規模な結果セットが予想される場合は、カーソルからドキュメントを個別に検索してください。 カーソルを反復処理する方法については、このガイドの「 ドキュメントを個別に取得する 」セクションを参照してください。

操作によって返されるカーソルを変更するには、 Cursorインスタンスを返すメソッドにオプション ビルダ メソッドを連結します。 たとえば、カーソル関連のオプション ビルダのメソッドをfind()メソッドに連鎖させることができます。

注意

設定オプション

オプション ビルダのメソッドをfind()メソッド呼び出しに直接連鎖させることで、 FindOptionsフィールドを設定できます。 以前のバージョンのドライバーを使用している場合は、オプション ビルダー メソッドをbuilder()メソッドに連結してFindOptionsインスタンスを構築する必要があります。 次に、 FindOptionsインスタンスをfind()のパラメータとして渡します。

次の表では、対応するビルダ メソッドを呼び出して設定できるカーソル関連のオプションについて説明します。

設定
説明
batch_size
Specifies the maximum number of documents the server returns per cursor batch. This option sets the number of documents the cursor keeps in memory rather than the number of documents the cursor returns.

Type: u32
Default: 101 documents initially, 16 MB maximum for subsequent batches
cursor_type
Specifies the type of cursor to return. You can set this option to produce a tailable cursor. To learn more about tailable cursors, see Tailable Cursors in the Server manual.

Type: CursorType
Default: CursorType::NonTailable
no_cursor_timeout
Specifies whether the server closes the cursor after a period of inactivity.

重要

Cursor型はDrop特性を実装しているため、サーバーはスコープを超えるとカーソルを閉じます。 サーバーは非同期killCursorsコマンドを実行してカーソルを閉じます。 詳細については、サーバー マニュアルのkillCursorsを参照してください。

Type: bool
Default: false

次のコードは、オプション ビルダー メソッドをfind()メソッドに連鎖させて、カーソル関連の設定を指定する方法を示しています。

let mut cursor = my_coll.find(doc! { "color": "red" })
.batch_size(5)
.cursor_type(CursorType::Tailable)
.no_cursor_timeout(true)
.await?;

このガイドの操作の詳細については、次のドキュメントを参照してください。

Rust 型と BSON の変換の詳細については、「データ モデリングと直列化 」に関するガイドを参照してください。

このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。

戻る

クエリを指定する