データモデリングと直列化
項目一覧
Overview
このガイドでは、Rust ドライバーが BSON 型と Rust 型の間の変換を処理する方法について学習できます。 Rust 型を BSON に変換するプロセスは直列化 と呼ばれ、その逆のプロセスは 逆直列化 と呼ばれます。
Rust言語は静的型システムを使用しますが、 BSONには 動的スキーマがあります。 Rust型とBSONの間の変換を処理するために、ドライバーと bson
ライブラリは Serdeフレームワークの機能を統合します。serde
crateをインストールする方法については、 crates.io
crateレジストリにある serde を参照してください。
serde
crate の機能をアプリケーションに実装することで、構造体や列挙型などのカスタム Rust 型を使用してデータをモデル化できます。
このガイドには、次のセクションが含まれています。
ジェネリック型パラメーターでは、コレクションのパラメーター化とデータ モデリングについて説明します
カスタム データ モデルでは、コレクション内のデータをモデル化するためにカスタム Rust タイプを定義する方法について説明します。
カスタム直列化では、属性を使用してデフォルトの直列化および逆直列化の動作を変更する方法について説明し、例を示します
追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します
ジェネリック型パラメーター
Collection
インスタンスを作成するときは、コレクション内のドキュメントをモデル化するデータ型を表すジェネリック型パラメータを指定する必要があります。 ジェネリック型パラメータの指定の詳細については、「 データベースとコレクション 」ガイドの 「コレクション パラメータ化 」セクションを参照してください。
コレクションのデータをモデル化するには、 Document
型を使用する代わりに、カスタム タイプを定義して使用することを推奨します。
カスタム データモデル
serde
crate からのSerialize
とDeserialize
の追尾を実装する Rust データ型は、 Collection
インスタンスのジェネリック型パラメータとして使用できます。 Serialize
とDeserialize
の特権を実装するには、Rust タイプを定義する前に次のderive
属性を含める必要があります。
カスタム構造の例
次のコードは、 serde
直列化特性を実装するサンプルVegetable
構造体を定義します。
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_with
とdeserialize_with
の属性を提供します。 これらのヘルパー関数は、特定のフィールドとバリアントの直列化と逆直列化をカスタマイズします。 フィールドに属性を指定するには、フィールド定義の前に属性を含めます。
struct MyStruct { field1: String, // ... other fields }
次のセクションでは、 bson
ライブラリのヘルパー関数を使用して一般的な直列化タスクを実行する例を見つけることができます。 これらのヘルパー関数の完全なリストを確認するには、 serde_helters API ドキュメント を参照してください。
ObjectId として string を直列化
構造体でドキュメント内の _id
フィールドを 16 進stringとして表現する場合があります。 16 進 string をObjectId
BSON 型に変換するには、 serialize_with
属性の値としてserialize_hex_string_as_object_id
ヘルパー関数を使用します。 次の例では、 serialize_with
属性を_id
フィールドに添付して、ドライバーが 16 進 string をObjectId
型として直列化します。
struct Order { _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 を string として直列化
では、ドキュメント内の DateTime
フィールド値を ISOstring 形式の として表現する場合があります。BSONこの変換を指定するには、 DateTime
値を持つフィールドにアタッチされたserialize_with
属性の値としてserialize_bson_datetime_as_rfc3339_string
ヘルパー関数を使用します。 次の例では、 serialize_with
属性をdelivery_date
フィールドに添付して、ドライバーがDateTime
値を string に直列化するようにします。
struct Order { item: 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" }
u32 を f64 として直列化
BSON では、ドキュメント内のu32
フィールド値をf64
またはDouble
、 タイプとして表現する場合があります。 この変換を指定するには、 u32
値を持つフィールドにアタッチされたserialize_with
属性の値としてserialize_u32_as_f64
ヘルパー関数を使用します。 次の例では、 serialize_with
属性をquantity
フィールドに添付して、ドライバーがu32
値をDouble
型に直列化します。
struct Order { item: String, quantity: u32, }
注意
u32
値の BSON Double
表現は、元の値と同じように表示されます。
その他の属性とモジュール
ヘルパー関数に加えて、 bson
ライブラリは直列化と逆直列化の両方を取り扱うモジュールを提供します。 特定のフィールドまたはバリアントで使用するモジュールを選択するには、 with
属性の値をモジュールの名前に設定します。
struct MyStruct { 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 ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。
Serialize_with サーバード属性
deserialize_with サーバード属性
と サーバード属性