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

FAQ

項目一覧

  • MongoDB への接続中にエラーが発生するのはなぜですか?
  • Rust ドライバーでの接続プーリングの仕組み
  • BSON タイプと Rust タイプの間でどのように変換されますか?
  • 条件に満たない限界エラーを修正するにはどうすればよいですか?
  • 結果またはオプションの列挙型にラップされた値の処理方法

このページでは、よくある質問とその回答を見つけることができます。

Tip

このページで質問に対する回答が見つからない場合は、問題を報告する方法については問題とヘルプページを参照してください。

MongoDB 配置への接続に問題がある場合は、考えられる解決策について接続のトラブルシューティングガイドを参照してください。

MongoDBクラスター内の各サーバーは接続プール を維持します。 接続プールの動作にアクセスまたは管理するには、 クライアント のインスタンスを使用します。接続プールはオンデマンドでソケットを開き、 マルチスレッドアプリケーションで同時操作をサポートします。

次の接続プール機能を構成できます。

  • 最大サイズと最小サイズ。 max_pool_sizemin_pool_sizeオプションで設定

  • プールが並列に作成する接続の最大数( max_connectingオプションで設定)

  • 最大アイドル時間。 max_idle_timeオプションで設定

接続プーリングの詳細については、 パフォーマンスに関する考慮事項 ガイドの「接続プール」セクションを参照してください。

Rust ドライバーと BSON ライブラリは、Serde フレームワークを使用してカスタム Rust 型と BSON の間の変換を実行します。 Serde フレームワークの機能にアクセスするには、 serde crate をCargo.tomlファイルに追加します。 このクローンを追加する手順については、「 serde を参照してください」を参照してください。 crate レジストリにある。

crate をアプリケーションに追加すると、BSON ドキュメントの代わりにカスタム タイプを使用して、コレクション内のドキュメントをモデル化できます。 次の例では、 Vegetable構造体定義の前にderive属性が含まれています。これは、必要に応じてドライバーに次のアクションを実行するように指示します。

  • 構造体を直列化し、構造体を BSON に変換する

  • BSON データを構造体に変換する BSON の逆シリアル化

#[derive(Serialize, Deserialize)]
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>型は、 Tの特権の限界が満たされている場合にのみ、 try_next()メソッドにアクセスするために必要なStream特権を実装します。 Tつまり、 はDeserializeOwned カーソル で指定されているように 特性を実装する必要があります API ドキュメント。次の例では、 actorsコレクション内のドキュメントをモデル化するためにカスタムActor構造体を定義することで、前述のエラー メッセージを複製します。 ただし、この構造体には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(doc! {}).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
};

特性の境界エラーを解決するには、カーソルが反復処理するデータ型を特定し、このデータ型がDeserializeOwned特権を実装していることを確認します。 derive属性を使用して必須特性のバインドを適用できます。

注意

所有特権の逆直列化と逆直列化

serde crate は、 Deserialize特権を含む特定の特権の実装を生成するための派生マイクロを提供します。 ただし、この crate はDeserializeOwned特権の派生マイクロを提供しません。 有効期限の制限なしでDeserializeを実装するデータ型は自動的にDeserializeOwnedを実装するため、 Deserializeを実装してDeserializeOwnedの制約を満たすことができます。

次の例えではActorの構造体定義を調整してDeserializeを実装します。

#[derive(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).await?;

あるいは、条件を作成して、 InsertOneResultのラップされていない値を処理することもできます。 次のコードでは、 matchキーワードを使用してinsert_one()の結果を処理します。

let insert_one_result = my_coll.insert_one(doc).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 言語ドキュメントの次のリソースを参照してください。

戻る

GridFS