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

データモデリングと直列化

項目一覧

  • Overview
  • ジェネリック型パラメーター
  • カスタム データモデル
  • カスタム構造の例
  • 複数のパラメーター化
  • カスタム直列化
  • ObjectId として string を直列化
  • DateTime を string として直列化
  • u32 を f64 として直列化
  • その他の属性とモジュール
  • 詳細情報
  • API ドキュメント

このガイドでは、Rust ドライバーが BSON 型と Rust 型の間の変換を処理する方法について学習できます。 Rust 型を BSON に変換するプロセスは直列化 と呼ばれ、その逆のプロセスは 逆直列化 と呼ばれます。

Rust 言語は静的型システムを使用しますが、BSON には動的スキーマがあります。 Rust 型と BSON の間の変換を処理するために、ドライバーと bsonライブラリは Serde フレームワークの機能を統合します。 serdecrate をインストールする方法については、 serde を参照してくださいcrates.io crate レジストリにある)。

serde crate の機能をアプリケーションに実装することで、構造体や列挙型などのカスタム Rust 型を使用してデータをモデル化できます。

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

  • ジェネリック型パラメーターでは、コレクションのパラメーター化とデータ モデリングについて説明します

  • カスタム データ モデルでは、コレクション内のデータをモデル化するためにカスタム Rust タイプを定義する方法について説明します。

  • カスタム直列化では、属性を使用してデフォルトの直列化および逆直列化の動作を変更する方法について説明し、例を示します

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

Collectionインスタンスを作成するときは、コレクション内のドキュメントをモデル化するデータ型を表すジェネリック型パラメータを指定する必要があります。 ジェネリック型パラメータの指定の詳細については、「 データベースとコレクション 」ガイドのコレクション パラメータ化 」セクションを参照してください。

コレクションのデータをモデル化するには、 Document型を使用する代わりに、カスタム タイプを定義して使用することを推奨します。

serde crate からのSerializeDeserializeの追尾を実装する Rust データ型は、 Collectionインスタンスのジェネリック型パラメータとして使用できます。 SerializeDeserializeの特権を実装するには、Rust タイプを定義する前に次のderive属性を含める必要があります。

#[derive(Serialize, Deserialize)]

次のコードは、 serde直列化特性を実装するサンプルVegetable構造体を定義します。

#[derive(Serialize, Deserialize)]
struct Vegetable {
name: String,
category: String,
tropical: bool,
}

次のコードは、 Vegetableをジェネリック型パラメーターとして持つvegetablesコレクションにアクセスします。

let my_coll: Collection<Vegetable> = client
.database("db")
.collection("vegetables");

CollectionインスタンスはVegetable構造体でパラメータ化されているため、このタイプで CRUD 操作を実行できます。 次のコードは、 Vegetableインスタンスを コレクションに挿入します。

let calabash = Vegetable {
name: "calabash".to_string(),
category: "gourd".to_string(),
tropical: true,
};
my_coll.insert_one(calabash).await?;

コレクションに複数のスキーマが含まれている場合は、各データ型をモデル化するためのカスタムタイプを定義し、各型の元のCollectionインスタンスのクローンを作成できます。 clone_with_type()メソッドを使用して、 Collectionインスタンスのクローンを作成できます。

最初にSquareという構造体でコレクションをパラメータ化していても、その後、 Circle構造体でモデル化された別のタイプのデータをコレクションに挿入したいと認識したとします。 次のコードでは、 Square型のコレクションをパラメータ化し、 Circle型でパラメータ化されたコレクションのクローンを作成します。

let shapes_coll: Collection<Square> = client
.database("db")
.collection("shapes");
// ... perform some operations with Square
let shapes_coll: Collection<Circle> = shapes_coll.clone_with_type();
// ... perform some operations with Circle

Rust ドライバーのデフォルトの直列化および逆直列化動作は、 serde crate の属性を使用して変更できます。 属性は、列挙型の構造体またはバリアントのフィールドに添付される任意のメタデータです。

serde crate は、ヘルパー関数を値として受け取るserialize_withdeserialize_withの属性を提供します。 これらのヘルパー関数は、特定のフィールドとバリアントの直列化と逆直列化をカスタマイズします。 フィールドに属性を指定するには、フィールド定義の前に属性を含めます。

#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(serialize_with = "<helper function>")]
field1: String,
// ... other fields
}

次のセクションでは、 bsonライブラリのヘルパー関数を使用して一般的な直列化タスクを実行する例を見つけることができます。 これらのヘルパー関数の完全なリストを確認するには、 serde_helters API ドキュメント を参照してください。

構造体でドキュメント内の _id フィールドを 16 進stringとして表現する場合があります。 16 進 string をObjectId BSON 型に変換するには、 serialize_with属性の値としてserialize_hex_string_as_object_idヘルパー関数を使用します。 次の例では、 serialize_with属性を_idフィールドに添付して、ドライバーが 16 進 string をObjectId型として直列化します。

#[derive(Serialize, Deserialize)]
struct Order {
#[serde(serialize_with = "serialize_hex_string_as_object_id")]
_id: String,
item: String,
}

ドライバーがサンプルのOrder 構造体を BSON に直列化する方法を確認するには、次のStruct タブとBSON タブから選択します。

let order = Order {
_id: "6348acd2e1a47ca32e79f46f".to_string(),
item: "lima beans".to_string(),
};
{
"_id": { "$oid": "6348acd2e1a47ca32e79f46f" },
"item": "lima beans"
}

では、ドキュメント内の DateTimeフィールド値を ISOstring 形式の として表現する場合があります。BSONこの変換を指定するには、 DateTime値を持つフィールドにアタッチされたserialize_with属性の値としてserialize_bson_datetime_as_rfc3339_stringヘルパー関数を使用します。 次の例では、 serialize_with属性をdelivery_dateフィールドに添付して、ドライバーがDateTime値を string に直列化するようにします。

#[derive(Serialize, Deserialize)]
struct Order {
item: String,
#[serde(serialize_with = "serialize_bson_datetime_as_rfc3339_string")]
delivery_date: DateTime,
}

ドライバーがサンプルのOrder 構造体を BSON に直列化する方法を確認するには、次のStruct タブとBSON タブから選択します。

let order = Order {
item: "lima beans".to_string(),
delivery_date: DateTime::now(),
};
{
"_id": { ... },
"item": "lima beans",
"delivery_date": "2023-09-26T17:30:18.181Z"
}

BSON では、ドキュメント内のu32フィールド値をf64またはDouble 、 タイプとして表現する場合があります。 この変換を指定するには、 u32値を持つフィールドにアタッチされたserialize_with属性の値としてserialize_u32_as_f64ヘルパー関数を使用します。 次の例では、 serialize_with属性をquantityフィールドに添付して、ドライバーがu32値をDouble型に直列化します。

#[derive(Serialize, Deserialize)]
struct Order {
item: String,
#[serde(serialize_with = "serialize_u32_as_f64")]
quantity: u32,
}

注意

u32値の BSON Double表現は、元の値と同じように表示されます。

ヘルパー関数に加えて、 bsonライブラリは直列化と逆直列化の両方を取り扱うモジュールを提供します。 特定のフィールドまたはバリアントで使用するモジュールを選択するには、 with属性の値をモジュールの名前に設定します。

#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(with = "<module>")]
field1: u32,
// ... other fields
}

これらのモジュールの完全なリストについては、 serde_helpers API ドキュメント を参照してください。

serde crateは、シリアル化をカスタマイズするための他の多くの属性を提供します。 次のリストでは、一般的な属性とその機能について説明しています。

  • rename: Rust 構造体またはバリアント名の代わりに、指定された名前でフィールドを直列化および逆直列化します

  • skip: 指定されたフィールドをシリアル化または逆シリアル化しない

  • default: 逆シリアル化中に値が存在しない場合は、 のデフォルト値を使用します Default::default()

serde属性の完全なリストについては、 serde 属性 API ドキュメントを参照してください。

BSON typesの詳細については、サーバー マニュアルの「 BSON types 」を参照してください。

serde機能を示すその他の例については、「 Rust 開発者センターでサーデを使用してデータを構造化する」に関する記事を参照してください。

Serde フレームワークの詳細については、 Server のドキュメント を参照してください。

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

戻る

複合演算子