知っておくべきMongoDBRustドライバー

このリポジトリには、公式にサポートされているMongoDB Rustドライバーが含まれています。これは、RustアプリケーションでMongoDBデプロイメントと対話するために使用できるクライアント側ライブラリです。bsonBSONサポートにクレートを使用します。ドライバーには、設定された機能フラグに応じて、tokio(デフォルト)またはのいずれかをサポートする完全非同期APIが含まれています。async-stdドライバーには、機能フラグを介して有効にできる同期APIもあります。

インストール

要件

  • さび1.48+
  • MongoDB 3.6+

インポート

ドライバーはcrates.ioで入手できます。アプリケーションでドライバーを使用するには、ドライバーをプロジェクトに追加するだけCargo.tomlです。

[dependencies]mongodb = "2.1.0"

非同期ランタイムの設定

このドライバーは、最も人気のある非同期ランタイムクレートの両方、つまりtokioとをサポートしますasync-std。デフォルトでは、ドライバーはを使用しますが、のいずれかまたは機能フラグをtokio指定することにより、ランタイムを明示的に選択できます。"tokio-runtime""async-std-runtime"Cargo.toml

たとえば、ドライバーに操作を指示するにasync-stdは、以下を追加しますCargo.toml

[dependencies.mongodb]version = "2.1.0"default-features = falsefeatures = ["async-std-runtime"]

同期APIの有効化

ドライバーは、ブロッキング同期APIも提供します。これを有効にするには、次の"sync"機能を追加しますCargo.toml

[dependencies.mongodb]version = "2.1.0"default-features = falsefeatures = ["sync"]

注:同期APIが有効になっている場合、非同期固有のタイプは非公開になります(例mongodb::Client)。mongodb::sync同期固有のタイプは、 (例)からインポートできますmongodb::sync::Client

すべての機能フラグ

特徴説明追加の依存関係ディフォルト
tokio-runtimetokio非同期ランタイムのサポートを有効にするtokiofull機能付き1.0はい
async-std-runtimeasync-stdランタイムのサポートを有効にするasync-std1.0いいえ
sync同期APIを公開します(mongodb::sync)。このフラグは、非同期ランタイム機能フラグのいずれかと組み合わせて使用​​することはできません。async-std1.0いいえ
aws-authMONGODB-AWS認証メカニズムのサポートを有効にします。reqwest0.11いいえ
bson-uuid-0_8uuid再エクスポートされたクレートのパブリックAPIでクレートのv0.8のサポートを有効にしますbson該当なしいいえ
bson-chrono-0_4chrono再エクスポートされたクレートのパブリックAPIでクレートのv0.4のサポートを有効にしますbson該当なしいいえ
zlib-compressionでメッセージを圧縮するためのサポートを有効にするzlibflate21.0いいえ
zstd-compressionでメッセージを圧縮するためのサポートを有効にしますzstd。このフラグにはRustバージョン1.54が必要です。zstd0.9.0いいえ
snappy-compressionでメッセージを圧縮するためのサポートを有効にするsnappysnap1.0.5いいえ

使用例

以下は、ドライバーの簡単な使用例です。より具体的な例とAPIリファレンスについては、ドライバーのdocs.rsページを参照してください。

非同期APIの使用

MongoDBデプロイメントへの接続

use mongodb::{Client, options::ClientOptions};
// Parse a connection string into an options struct.let mut client_options = ClientOptions::parse("mongodb://localhost:27017").await?;// Manually set an option.client_options.app_name = Some("My App".to_string());// Get a handle to the deployment.let client = Client::with_options(client_options)?;// List the names of the databases in that deployment.for db_name in client.list_database_names(None, None).await? {    println!("{}", db_name);}

データベースへのハンドルの取得

// Get a handle to a database.let db = client.database("mydb");// List the names of the collections in that database.for collection_name in db.list_collection_names(None).await? {    println!("{}", collection_name);}

コレクションへのドキュメントの挿入

use mongodb::bson::{doc, Document};
// Get a handle to a collection in the database.let collection = db.collection::<Document>("books");let docs = vec![    doc! { "title": "1984", "author": "George Orwell" },    doc! { "title": "Animal Farm", "author": "George Orwell" },    doc! { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },];// Insert some documents into the "mydb.books" collection.collection.insert_many(docs, None).await?;

Aは、クレートからの特性と特性Collectionを実装する任意のタイプでパラメータ化できます。SerializeDeserializeserdeDocument

# In Cargo.toml, add the following dependency.serde = { version = "1.0", features = ["derive"] }
use serde::{Deserialize, Serialize};#[derive(Debug, Serialize, Deserialize)]struct Book {    title: String,    author: String,}
// Get a handle to a collection of `Book`.let typed_collection = db.collection::<Book>("books");let books = vec![    Book {        title: "The Grapes of Wrath".to_string(),        author: "John Steinbeck".to_string(),    },    Book {        title: "To Kill a Mockingbird".to_string(),        author: "Harper Lee".to_string(),    },];// Insert the books into "mydb.books" collection, no manual conversion to BSON necessary.typed_collection.insert_many(books, None).await?;

コレクション内のドキュメントの検索

クエリの結果は通常Cursor、要求に応じてサーバーから結果をストリーミングする構造体を介して返されます。このCursorタイプはStream、クレートからトレイトを実装します。そのストリーミング機能にアクセスするには、またはトレイトfuturesの少なくとも1つをインポートする必要があります。StreamExtTryStreamExt

# In Cargo.toml, add the following dependency.futures = "0.3"
// This trait is required to use `try_next()` on the cursoruse futures::stream::TryStreamExt;use mongodb::{bson::doc, options::FindOptions};
// Query the books in the collection with a filter and an option.let filter = doc! { "author": "George Orwell" };let find_options = FindOptions::builder().sort(doc! { "title": 1 }).build();let mut cursor = typed_collection.find(filter, find_options).await?;// Iterate over the results of the cursor.while let Some(book) = cursor.try_next().await? {    println!("title: {}", book.title);}

同期APIの使用

ドライバーは、ブロッキング同期APIも提供します。有効にする方法については、「インストール」セクションを参照してください。

さまざまな同期固有のタイプはmongodb::sync、非同期APIのようにクレートのトップレベルではなく、サブモジュールにあります。ただし、同期APIは内部的に非同期APIを呼び出すため、外観と動作は同じです。

use mongodb::{    bson::doc,    sync::Client,};use serde::{Deserialize, Serialize};#[derive(Debug, Serialize, Deserialize)]struct Book {    title: String,    author: String,}
let client = Client::with_uri_str("mongodb://localhost:27017")?;let database = client.database("mydb");let collection = database.collection::<Book>("books");let docs = vec![    Book {        title: "1984".to_string(),        author: "George Orwell".to_string(),    },    Book {        title: "Animal Farm".to_string(),        author: "George Orwell".to_string(),    },    Book {        title: "The Great Gatsby".to_string(),        author: "F. Scott Fitzgerald".to_string(),    },];// Insert some books into the "mydb.books" collection.collection.insert_many(docs, None)?;let cursor = collection.find(doc! { "author": "George Orwell" }, None)?;for result in cursor {    println!("title: {}", result?.title);}

プラットフォーム

ドライバーは、CIでLinux、MacOS、およびWindowsに対してテストします。

アトラスノート

現在、サーバーのバージョンが4.2以上でない限り、ドライバーにはM2より上のAtlas層への接続に問題があります。現在、この修正に取り組んでいますが、当面の間、回避策はクラスターを4.2にアップグレードすることです。ドライバには、M0またはM2インスタンスのいずれにも既知の問題はありません。

WindowsDNSノート

Windowsでは、ドライバーがDNSルックアップを実行するために使用するクレートに既知の問題がありtrust-dns-resolver、システム構成を使用するリゾルバーのパフォーマンスが大幅に低下します。ドライバーはデフォルトでシステム構成を使用するため、問題が解決するまで、Windowsで代替のリゾルバー構成を指定することをお勧めします。これは、接続文字列を使用してデプロイメントに接続する場合にのみ効果がありmongodb+srvます。

例えば

use mongodb::{    options::{ClientOptions, ResolverConfig},    Client,};
let options = ClientOptions::parse_with_resolver_config(    "mongodb+srv://my.host.com",    ResolverConfig::cloudflare(),).await?;let client = Client::with_options(options)?;

タイムアウト/キャンセルに関する警告

async Rustでは、フューチャーをポーリングして完了するのではなく、一定期間後にドロップすることでキャンセルとタイムアウトを実装するのが一般的です。tokio::time::timeoutたとえば、これがどのように機能するかです。ただし、ドライバーから返された先物を使用してこれを行うと、ドライバーの内部が一貫性のない状態のままになる可能性があり、予測できない、または誤った動作につながる可能性があります(詳細についてはRUST-937を参照)。そのため、ドライバーから完了までに返されたすべての先物をポーリングすることを強くお勧めします。tokio::time::timeoutドライバーと同様にタイムアウトメカニズムを引き続き使用するための1つのオプションは、タスクを生成し、タスクでタイムアウトすることです。JoinHandleドライバーの先物に直接ではなく、先物。これにより、ドライバーの先物が常に完全にポーリングされると同時に、タイムアウトが発生した場合でもアプリケーションを続行できるようになります。

例えば

let collection = client.database("ok").collection("ok");let handle = tokio::task::spawn(async move {    collection.insert_one(doc! { "x": 1 }, None).await});tokio::time::timeout(Duration::from_secs(5), handle).await???;

バグレポート/機能リクエスト

バグレポートを提出したり、機能リクエストを送信したりするには、Jiraプロジェクトのチケットを開いてください。

チケットを提出する前に、Jiraの検索機能を使用して、同様の問題がすでに提出されているかどうかを確認してください。

貢献

GitHubプルリクエストの形での投稿を奨励し、喜んで受け入れます。開く前に、必ずローカルでテストを実行してください。その方法については、テストセクションを確認してください。プルリクエストを開くと、継続的インテグレーションシステムで使用しているのと同じテストマトリックスに対してブランチが実行されるため、通常は、スタンドアロンに対してローカルでのみ統合テストを実行するだけで十分です。プルリクエストを開く前に、必ずリンターテストを実行してください。

テストの実行

統合と単体テスト

テスト(ほとんどは統合テスト)を実行するには、MongoDBデプロイメントにアクセスできる必要があります。環境変数にMongoDB接続文字列を指定すると、テストではそれを使用してデプロイメントに接続します。MONGODB_URIが設定されていない場合MONGODB_URI、テストはポート27017でローカル展開に接続しようとします。

注:統合テストは、使用する必要のあるデータベース/コレクションをクリアしますが、その後はクリーンアップしません。

実際にテストを実行するにcargoは、他のクレートと同じように使用できます。

cargo test --verbose # runs against localhost:27017export MONGODB_URI="mongodb://localhost:123"cargo test --verbose # runs against localhost:123

認証テスト

認証テストは、特定の要件が満たされている場合にのみテスト実行に含まれます。

  • 展開が--auth有効になっている必要があります
  • クレデンシャルはで指定する必要がありますMONGODB_URI
  • で指定された資格情報はMONGODB_URI有効であり、展開に対するroot権限を持っている必要があります
export MONGODB_URI="mongodb://user:pass@localhost:27017"cargo test --verbose # auth tests included

トポロジ固有のテスト

特定のテストは、特定のトポロジに対してのみ実行されます。テストスイート全体が確実に実行されるようにするには、スタンドアロン、レプリケート、およびシャーディングされたデプロイメントに対して個別にテストを実行するようにしてください。

export MONGODB_URI="mongodb://my-standalone-host:27017" # mongod running on 27017cargo test --verboseexport MONGODB_URI="mongodb://localhost:27018,localhost:27019,localhost:27020/?replicaSet=repl" # replicaset running on ports 27018, 27019, 27020 with name replcargo test --verboseexport MONGODB_URI="mongodb://localhost:27021" # mongos running on 27021cargo test --verbose

TLS/SSLを使用してテストを実行します

TLS / SSLを有効にしてテストを実行するには、展開およびでテストを有効にする必要がありますMONGODB_URI

export MONGODB_URI="mongodb://localhost:27017/?tls=true&tlsCertificateKeyFile=cert.pem&tlsCAFile=ca.pem"cargo test --verbose

注:プルリクエストを開くと、コードは包括的なテストマトリックスに対して実行されるため、通常、トポロジ/認証/TLSのすべての組み合わせに対してローカルで統合テストを実行する必要はありません。

リンターテスト

私たちのリンターテストでは、ナイトリーバージョンを使用rustfmtしてソースが適切にフォーマットされていることを確認し、安定バージョンをclippy使用して一般的な間違いを静的に検出します。rustup両方をインストールするために使用できます。

rustup component add clippy --toolchain stablerustup component add rustfmt --toolchain nightly

私たちのリンターテストはrustdoc、必要なすべてのドキュメントが存在し、適切にフォーマットされていることを確認するためにも使用されます。rustdoc標準のRustディストリビューションに含まれています。

リンターテストを実行するcheck-clippy.shには、ディレクトリ内の、、、check-rustfmt.shおよびcheck-rustdoc.shスクリプトを実行し.evergreenます。3つすべてを実行するには、check-all.shスクリプトを使用します。

bash .evergreen/check-all.sh

継続的インテグレーション

マスターへのコミットは常緑樹で自動的に実行されます。

サポートされている最小のRustバージョン(MSRV)

このクレートのMSRVは現在1.48.0です。これが増えることはめったになく、増えたとしても、マイナーバージョンまたはメジャーバージョンのリリースでのみ発生します。

ライセンス

このプロジェクトは、ApacheLicense2.0の下でライセンスされています。 

リンク:https ://crates.io/crates/mongodb

#mongodb  #rust 

What is GEEK

Buddha Community

知っておくべきMongoDBRustドライバー

知っておくべきMongoDBRustドライバー

このリポジトリには、公式にサポートされているMongoDB Rustドライバーが含まれています。これは、RustアプリケーションでMongoDBデプロイメントと対話するために使用できるクライアント側ライブラリです。bsonBSONサポートにクレートを使用します。ドライバーには、設定された機能フラグに応じて、tokio(デフォルト)またはのいずれかをサポートする完全非同期APIが含まれています。async-stdドライバーには、機能フラグを介して有効にできる同期APIもあります。

インストール

要件

  • さび1.48+
  • MongoDB 3.6+

インポート

ドライバーはcrates.ioで入手できます。アプリケーションでドライバーを使用するには、ドライバーをプロジェクトに追加するだけCargo.tomlです。

[dependencies]mongodb = "2.1.0"

非同期ランタイムの設定

このドライバーは、最も人気のある非同期ランタイムクレートの両方、つまりtokioとをサポートしますasync-std。デフォルトでは、ドライバーはを使用しますが、のいずれかまたは機能フラグをtokio指定することにより、ランタイムを明示的に選択できます。"tokio-runtime""async-std-runtime"Cargo.toml

たとえば、ドライバーに操作を指示するにasync-stdは、以下を追加しますCargo.toml

[dependencies.mongodb]version = "2.1.0"default-features = falsefeatures = ["async-std-runtime"]

同期APIの有効化

ドライバーは、ブロッキング同期APIも提供します。これを有効にするには、次の"sync"機能を追加しますCargo.toml

[dependencies.mongodb]version = "2.1.0"default-features = falsefeatures = ["sync"]

注:同期APIが有効になっている場合、非同期固有のタイプは非公開になります(例mongodb::Client)。mongodb::sync同期固有のタイプは、 (例)からインポートできますmongodb::sync::Client

すべての機能フラグ

特徴説明追加の依存関係ディフォルト
tokio-runtimetokio非同期ランタイムのサポートを有効にするtokiofull機能付き1.0はい
async-std-runtimeasync-stdランタイムのサポートを有効にするasync-std1.0いいえ
sync同期APIを公開します(mongodb::sync)。このフラグは、非同期ランタイム機能フラグのいずれかと組み合わせて使用​​することはできません。async-std1.0いいえ
aws-authMONGODB-AWS認証メカニズムのサポートを有効にします。reqwest0.11いいえ
bson-uuid-0_8uuid再エクスポートされたクレートのパブリックAPIでクレートのv0.8のサポートを有効にしますbson該当なしいいえ
bson-chrono-0_4chrono再エクスポートされたクレートのパブリックAPIでクレートのv0.4のサポートを有効にしますbson該当なしいいえ
zlib-compressionでメッセージを圧縮するためのサポートを有効にするzlibflate21.0いいえ
zstd-compressionでメッセージを圧縮するためのサポートを有効にしますzstd。このフラグにはRustバージョン1.54が必要です。zstd0.9.0いいえ
snappy-compressionでメッセージを圧縮するためのサポートを有効にするsnappysnap1.0.5いいえ

使用例

以下は、ドライバーの簡単な使用例です。より具体的な例とAPIリファレンスについては、ドライバーのdocs.rsページを参照してください。

非同期APIの使用

MongoDBデプロイメントへの接続

use mongodb::{Client, options::ClientOptions};
// Parse a connection string into an options struct.let mut client_options = ClientOptions::parse("mongodb://localhost:27017").await?;// Manually set an option.client_options.app_name = Some("My App".to_string());// Get a handle to the deployment.let client = Client::with_options(client_options)?;// List the names of the databases in that deployment.for db_name in client.list_database_names(None, None).await? {    println!("{}", db_name);}

データベースへのハンドルの取得

// Get a handle to a database.let db = client.database("mydb");// List the names of the collections in that database.for collection_name in db.list_collection_names(None).await? {    println!("{}", collection_name);}

コレクションへのドキュメントの挿入

use mongodb::bson::{doc, Document};
// Get a handle to a collection in the database.let collection = db.collection::<Document>("books");let docs = vec![    doc! { "title": "1984", "author": "George Orwell" },    doc! { "title": "Animal Farm", "author": "George Orwell" },    doc! { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },];// Insert some documents into the "mydb.books" collection.collection.insert_many(docs, None).await?;

Aは、クレートからの特性と特性Collectionを実装する任意のタイプでパラメータ化できます。SerializeDeserializeserdeDocument

# In Cargo.toml, add the following dependency.serde = { version = "1.0", features = ["derive"] }
use serde::{Deserialize, Serialize};#[derive(Debug, Serialize, Deserialize)]struct Book {    title: String,    author: String,}
// Get a handle to a collection of `Book`.let typed_collection = db.collection::<Book>("books");let books = vec![    Book {        title: "The Grapes of Wrath".to_string(),        author: "John Steinbeck".to_string(),    },    Book {        title: "To Kill a Mockingbird".to_string(),        author: "Harper Lee".to_string(),    },];// Insert the books into "mydb.books" collection, no manual conversion to BSON necessary.typed_collection.insert_many(books, None).await?;

コレクション内のドキュメントの検索

クエリの結果は通常Cursor、要求に応じてサーバーから結果をストリーミングする構造体を介して返されます。このCursorタイプはStream、クレートからトレイトを実装します。そのストリーミング機能にアクセスするには、またはトレイトfuturesの少なくとも1つをインポートする必要があります。StreamExtTryStreamExt

# In Cargo.toml, add the following dependency.futures = "0.3"
// This trait is required to use `try_next()` on the cursoruse futures::stream::TryStreamExt;use mongodb::{bson::doc, options::FindOptions};
// Query the books in the collection with a filter and an option.let filter = doc! { "author": "George Orwell" };let find_options = FindOptions::builder().sort(doc! { "title": 1 }).build();let mut cursor = typed_collection.find(filter, find_options).await?;// Iterate over the results of the cursor.while let Some(book) = cursor.try_next().await? {    println!("title: {}", book.title);}

同期APIの使用

ドライバーは、ブロッキング同期APIも提供します。有効にする方法については、「インストール」セクションを参照してください。

さまざまな同期固有のタイプはmongodb::sync、非同期APIのようにクレートのトップレベルではなく、サブモジュールにあります。ただし、同期APIは内部的に非同期APIを呼び出すため、外観と動作は同じです。

use mongodb::{    bson::doc,    sync::Client,};use serde::{Deserialize, Serialize};#[derive(Debug, Serialize, Deserialize)]struct Book {    title: String,    author: String,}
let client = Client::with_uri_str("mongodb://localhost:27017")?;let database = client.database("mydb");let collection = database.collection::<Book>("books");let docs = vec![    Book {        title: "1984".to_string(),        author: "George Orwell".to_string(),    },    Book {        title: "Animal Farm".to_string(),        author: "George Orwell".to_string(),    },    Book {        title: "The Great Gatsby".to_string(),        author: "F. Scott Fitzgerald".to_string(),    },];// Insert some books into the "mydb.books" collection.collection.insert_many(docs, None)?;let cursor = collection.find(doc! { "author": "George Orwell" }, None)?;for result in cursor {    println!("title: {}", result?.title);}

プラットフォーム

ドライバーは、CIでLinux、MacOS、およびWindowsに対してテストします。

アトラスノート

現在、サーバーのバージョンが4.2以上でない限り、ドライバーにはM2より上のAtlas層への接続に問題があります。現在、この修正に取り組んでいますが、当面の間、回避策はクラスターを4.2にアップグレードすることです。ドライバには、M0またはM2インスタンスのいずれにも既知の問題はありません。

WindowsDNSノート

Windowsでは、ドライバーがDNSルックアップを実行するために使用するクレートに既知の問題がありtrust-dns-resolver、システム構成を使用するリゾルバーのパフォーマンスが大幅に低下します。ドライバーはデフォルトでシステム構成を使用するため、問題が解決するまで、Windowsで代替のリゾルバー構成を指定することをお勧めします。これは、接続文字列を使用してデプロイメントに接続する場合にのみ効果がありmongodb+srvます。

例えば

use mongodb::{    options::{ClientOptions, ResolverConfig},    Client,};
let options = ClientOptions::parse_with_resolver_config(    "mongodb+srv://my.host.com",    ResolverConfig::cloudflare(),).await?;let client = Client::with_options(options)?;

タイムアウト/キャンセルに関する警告

async Rustでは、フューチャーをポーリングして完了するのではなく、一定期間後にドロップすることでキャンセルとタイムアウトを実装するのが一般的です。tokio::time::timeoutたとえば、これがどのように機能するかです。ただし、ドライバーから返された先物を使用してこれを行うと、ドライバーの内部が一貫性のない状態のままになる可能性があり、予測できない、または誤った動作につながる可能性があります(詳細についてはRUST-937を参照)。そのため、ドライバーから完了までに返されたすべての先物をポーリングすることを強くお勧めします。tokio::time::timeoutドライバーと同様にタイムアウトメカニズムを引き続き使用するための1つのオプションは、タスクを生成し、タスクでタイムアウトすることです。JoinHandleドライバーの先物に直接ではなく、先物。これにより、ドライバーの先物が常に完全にポーリングされると同時に、タイムアウトが発生した場合でもアプリケーションを続行できるようになります。

例えば

let collection = client.database("ok").collection("ok");let handle = tokio::task::spawn(async move {    collection.insert_one(doc! { "x": 1 }, None).await});tokio::time::timeout(Duration::from_secs(5), handle).await???;

バグレポート/機能リクエスト

バグレポートを提出したり、機能リクエストを送信したりするには、Jiraプロジェクトのチケットを開いてください。

チケットを提出する前に、Jiraの検索機能を使用して、同様の問題がすでに提出されているかどうかを確認してください。

貢献

GitHubプルリクエストの形での投稿を奨励し、喜んで受け入れます。開く前に、必ずローカルでテストを実行してください。その方法については、テストセクションを確認してください。プルリクエストを開くと、継続的インテグレーションシステムで使用しているのと同じテストマトリックスに対してブランチが実行されるため、通常は、スタンドアロンに対してローカルでのみ統合テストを実行するだけで十分です。プルリクエストを開く前に、必ずリンターテストを実行してください。

テストの実行

統合と単体テスト

テスト(ほとんどは統合テスト)を実行するには、MongoDBデプロイメントにアクセスできる必要があります。環境変数にMongoDB接続文字列を指定すると、テストではそれを使用してデプロイメントに接続します。MONGODB_URIが設定されていない場合MONGODB_URI、テストはポート27017でローカル展開に接続しようとします。

注:統合テストは、使用する必要のあるデータベース/コレクションをクリアしますが、その後はクリーンアップしません。

実際にテストを実行するにcargoは、他のクレートと同じように使用できます。

cargo test --verbose # runs against localhost:27017export MONGODB_URI="mongodb://localhost:123"cargo test --verbose # runs against localhost:123

認証テスト

認証テストは、特定の要件が満たされている場合にのみテスト実行に含まれます。

  • 展開が--auth有効になっている必要があります
  • クレデンシャルはで指定する必要がありますMONGODB_URI
  • で指定された資格情報はMONGODB_URI有効であり、展開に対するroot権限を持っている必要があります
export MONGODB_URI="mongodb://user:pass@localhost:27017"cargo test --verbose # auth tests included

トポロジ固有のテスト

特定のテストは、特定のトポロジに対してのみ実行されます。テストスイート全体が確実に実行されるようにするには、スタンドアロン、レプリケート、およびシャーディングされたデプロイメントに対して個別にテストを実行するようにしてください。

export MONGODB_URI="mongodb://my-standalone-host:27017" # mongod running on 27017cargo test --verboseexport MONGODB_URI="mongodb://localhost:27018,localhost:27019,localhost:27020/?replicaSet=repl" # replicaset running on ports 27018, 27019, 27020 with name replcargo test --verboseexport MONGODB_URI="mongodb://localhost:27021" # mongos running on 27021cargo test --verbose

TLS/SSLを使用してテストを実行します

TLS / SSLを有効にしてテストを実行するには、展開およびでテストを有効にする必要がありますMONGODB_URI

export MONGODB_URI="mongodb://localhost:27017/?tls=true&tlsCertificateKeyFile=cert.pem&tlsCAFile=ca.pem"cargo test --verbose

注:プルリクエストを開くと、コードは包括的なテストマトリックスに対して実行されるため、通常、トポロジ/認証/TLSのすべての組み合わせに対してローカルで統合テストを実行する必要はありません。

リンターテスト

私たちのリンターテストでは、ナイトリーバージョンを使用rustfmtしてソースが適切にフォーマットされていることを確認し、安定バージョンをclippy使用して一般的な間違いを静的に検出します。rustup両方をインストールするために使用できます。

rustup component add clippy --toolchain stablerustup component add rustfmt --toolchain nightly

私たちのリンターテストはrustdoc、必要なすべてのドキュメントが存在し、適切にフォーマットされていることを確認するためにも使用されます。rustdoc標準のRustディストリビューションに含まれています。

リンターテストを実行するcheck-clippy.shには、ディレクトリ内の、、、check-rustfmt.shおよびcheck-rustdoc.shスクリプトを実行し.evergreenます。3つすべてを実行するには、check-all.shスクリプトを使用します。

bash .evergreen/check-all.sh

継続的インテグレーション

マスターへのコミットは常緑樹で自動的に実行されます。

サポートされている最小のRustバージョン(MSRV)

このクレートのMSRVは現在1.48.0です。これが増えることはめったになく、増えたとしても、マイナーバージョンまたはメジャーバージョンのリリースでのみ発生します。

ライセンス

このプロジェクトは、ApacheLicense2.0の下でライセンスされています。 

リンク:https ://crates.io/crates/mongodb

#mongodb  #rust