このページでは、よくある質問とその回答を見つけることができます。
Tip
このページで質問に対する回答が見つからない場合は、問題を報告する方法についてはの問題とヘルプページを参照してください。
MongoDB への接続中にエラーが発生するのはなぜですか?
MongoDB 配置への接続に問題がある場合は、考えられる解決策について接続のトラブルシューティングガイドを参照してください。
Rust ドライバーでの接続プーリングの仕組み
MongoDBクラスター内の各サーバーは接続プールを維持します。接続プールの動作にアクセスまたは管理するには、 クライアント のインスタンスを使用します。接続プールはオンデマンドでソケットを開き、 マルチスレッドアプリケーションで同時操作をサポートします。
次の接続プール機能を構成できます。
最大サイズと最小サイズ。
max_pool_size
とmin_pool_size
オプションで設定プールが並列に作成する接続の最大数(
max_connecting
オプションで設定)最大アイドル時間。
max_idle_time
オプションで設定
接続プーリングの詳細については、 パフォーマンスに関する考慮事項 ガイドの「接続プール」セクションを参照してください。
BSON タイプと Rust タイプの間でどのように変換されますか?
RustドライバーとBSONライブラリは、Serdeフレームワークを使用してカスタムRust型とBSONの間の変換を実行します。serde
ファイルにCargo.toml
crateを追加すると、Serdeフレームワークの機能にアクセスできます。このcrateを追加する手順については、 crate レジストリの serde を参照してください。
crate をアプリケーションに追加すると、BSON ドキュメントの代わりにカスタム タイプを使用して、コレクション内のドキュメントをモデル化できます。 次の例では、 Vegetable
構造体定義の前にderive
属性が含まれています。これは、必要に応じてドライバーに次のアクションを実行するように指示します。
構造体を直列化し、構造体を BSON に変換する
BSON データを構造体に変換する BSON の逆シリアル化
struct Vegetable { // Add struct fields here }
次に、カスタム構造体型をジェネリック型パラメータとして持つCollection
インスタンスを作成できます。 次の例では、 Vegetable
型でパラメータ化されたCollection
インスタンスをmy_coll
変数に割り当てます。
let my_coll: Collection<Vegetable> = client.database("db").collection("vegetables");
BSON 型と Rust 型の変換の詳細については、「データ モデリングと直列化」のガイドおよび「 Rust MongoDB 開発者センターでの Server によるデータの構造化」に関する記事を参照してください。
条件に満たない限界エラーを修正するにはどうすればよいですか?
限界が設定されているため、メソッドはパラメーターとして受け入れる型と、それらの型に実装する必要がある機能を制限できます。 たとえば、ジェネリック型パラメーターを受け入れ、その値を出力するメソッドを定義する場合、そのパラメーターは出力目的でDisplay
トラートを実装する必要があります。 次の例えではprinter()
メソッドを定義し、そのパラメーターがDisplay
を実装する必要があることを指定します。
fn printer<T: Display>(t: T) { println!("{}", t); }
データ型でメソッドを呼び出すと、メソッドの機能の限界が満たされていないことを示すエラーが発生する場合があります。 たとえば、 Cursor
インスタンスでtry_next()
メソッドを呼び出すと、ドライバーにより次のエラー メッセージが表示される場合があります。
error[E0599]: the method `try_next` exists for struct `mongodb::Cursor<T>`, but its trait bounds were not satisfied
Cursor<T>
Stream
try_next()
T
型は、T
の特権の限界が満たされている場合にのみ、DeserializeOwned
メソッドにアクセスするために必要な 特権を実装します。つまり、 は、カーソルAPIドキュメントに指定されているように 特性を実装する必要があります。次の例では、 コレクション内のドキュメントをモデル化するためのカスタム 構造体を定義することで、前述のエラーActor
actors
メッセージを複製します。ただし、この構造体にはDeserializeOwned
特権が実装されていないため、try_next()
メソッドを使用してActor
インスタンスを反復処理するとエラーが発生します。
struct Actor { name: String, } // Add setup code here let my_coll: Collection<Actor> = client.database("db").collection("actors"); let mut cursor = my_coll.find(None, None).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); };
特性の境界エラーを解決するには、カーソルが反復処理するデータ型を特定し、このデータ型がDeserializeOwned
特権を実装していることを確認します。 derive
属性を使用して必須特性のバインドを適用できます。
注意
所有特権の逆直列化と逆直列化
serde
crate は、 Deserialize
特権を含む特定の特権の実装を生成するための派生マイクロを提供します。 ただし、この crate はDeserializeOwned
特権の派生マイクロを提供しません。 有効期限の制限なしでDeserialize
を実装するデータ型は自動的にDeserializeOwned
を実装するため、 Deserialize
を実装してDeserializeOwned
の制約を満たすことができます。
次の例えではActor
の構造体定義を調整してDeserialize
を実装します。
struct Actor { name: String, }
特性の限界の詳細については、次のリソースを参照してください。
コミュニティフォーラムでのカーソル機能の限界に関する質問
結果またはオプションの列挙型にラップされた値の処理方法
Rust は、アプリケーション コードの予防手段としてResult
列とOption
列を提供します。 Rust ドライバーが提供する多くのメソッドは、これら 2 つのタイプのいずれかにラップされた値を返します。
Result
列挙型は、次のバリアントを返すことができます。
Ok(T)
: は操作の結果の値をラップします。Err(E)
: 操作が失敗した場合にエラー値をラップします
たとえば、 insert_one()
メソッドは、成功した応答またはエラーのいずれかをラップするためのResult
型を返します。
insert_one()
のラップされていない結果にアクセスするには、 ?
演算子を使用します。 操作が成功した場合、メソッドはResult
列挙型のOk(InsertOneResult)
バリアントを返します。 この場合、 ?
演算子はInsertOneResult
値のラップを解除し、それをinsert_one_result
変数に割り当てます。 操作が成功した場合、メソッドはErr(E)
列挙バリアントを返し、 ?
演算子はラップを解除してエラー値を返します。 次のコードは、挿入操作の結果を処理するときに?
演算子を使用するための構文を示しています。
let insert_one_result = my_coll.insert_one(doc, None).await?;
あるいは、条件を作成して、 InsertOneResult
のラップされていない値を処理することもできます。 次のコードでは、 match
キーワードを使用してinsert_one()
の結果を処理します。
let insert_one_result = my_coll.insert_one(doc, None).await; match insert_one_result { Ok(val) => { println!("Document inserted with ID: {}", val.inserted_id); }, Err(err) => { println!("Operation not successful"); } }
Option
列挙型は、次のバリアントを返すことができます。
None
: 操作によって返された空の値を表しますSome(T)
: 空でない戻り値をラップします
一部の Rust ドライバー メソッドは、 read_concern()
メソッドなどのOption
タイプを返します。 このメソッドは、読み取り保証が存在しない場合は空の値またはReadConcern
値のいずれかをラップするOption
を返します。
read_concern()
match
の結果にアクセスするには、前述の例に示すように同じ 構文を使用して、None
Some(T)
バリアントと バリアントを処理します。あるいは、 if let
構文を使用してSome(T)
バリアントのみを処理することもできます。 次のコードでは、空でないread_concern()
戻り値(存在する場合)のラップを解除して出力します。
if let Some(rc) = my_coll.read_concern() { println!("Read concern: {:?}", rc); }
Result
列挙型とOption
列挙型の詳細については、Rust 言語ドキュメントの次のリソースを参照してください。