TLDR:在 Rust 中使用 BSON 很棘手 - BSON 具有动态模式,而 Rust 使用静态类型系统。要在 BSON 和 Rust 结构和枚举之间执行转换,请使用 Serde。 Serde 是一个强大的工具,它为不同数据格式之间的转换提供了许多功能。在即将发布的 MongoDB Rust 驱动程序和 BSON 库的 1.2.0 版本中,我们让直接使用 Rust 数据类型变得更加容易。本文是MongoDB Developer Hub上更详细的一篇文章的精简版。

有关在 Rust 中使用 MongoDB 的更多详细信息,您可以查看Rust 驱动程序和BSON 库的文档。在此处查看我们的 Rust 入门教程。

-

使用更新版本的 Rust 工具链(v1.44+),我们为 Collection 类型引入了一个泛型类型参数。通用参数表示您要插入到 MongoDB 集合中并从中查找的数据类型。任何派生/实现 Serde Serialize 和 Deserialize 特征的 Rust 数据类型都可以用作 Collection 的类型参数。

例如,我正在使用以下结构,它定义了学生集合中的数据架构:

#[derive(Serialize, Deserialize)
struct Student {
   name: String,
   grade: u32,
   test_scores: Vec<u32>,
}

进入全屏模式 退出全屏模式

通过使用 Database::collection_with_type 方法并指定 Student 作为数据类型来创建一个通用集合:

let students: Collection<Student> = db.collection_with_type("students");

进入全屏模式 退出全屏模式

在引入泛型 Collection 之前,各种 CRUD Collection 方法接受并返回 Document 类型。这意味着我需要先将我的 Student 结构序列化为 Documents,然后再将它们插入到学生集合中。现在,我可以将 Student 直接插入到我的集合中:

let student = Student {
    name: "Emily".to_string(),
    grade: 10,
    test_scores: vec![98, 87, 100],
};
let result = students.insert_one(student, None).await;

进入全屏模式 退出全屏模式

要直接从集合中查找学生:

// student is of type Student
let student = students.find_one(doc! { "name": "Emily" }, None).await?;

进入全屏模式 退出全屏模式

Collection 的默认泛型类型是 Document。这意味着在没有泛型类型的情况下创建的任何 Collection 将继续查找并返回 Document 类型,并且任何使用 Collection 的现有代码将不受这些更改的影响。

BSON 库现在包含一组函数,这些函数在使用 BSON 时实现自定义序列化和反序列化的常用策略。您可以通过从 bson-rust crate 中的 serde_helpers 模块导入这些函数并使用 serialize_with 和 deserialize_with 属性来使用这些函数。

我们介绍了同时处理序列化和反序列化的模块。例如,我可能想在 Rust uuid crate 中使用 Uuid 类型来表示二进制数据:

#[derive(Serialize, Deserialize)]
struct Item {
   uuid: Uuid,
   // rest of fields
}

进入全屏模式 退出全屏模式

由于 BSON 没有特定的 UUID 类型,如果我想序列化为 BSON,我需要将此数据转换为二进制。从 BSON 反序列化时,我还想转换回 Uuid。 serde_helpers 模块中的 uuid_as_binary 模块可以处理这两种转换。我将添加以下属性以使用此模块:

#[derive(Serialize, Deserialize)]
struct Item {
   #[serde(with = “uuid_as_binary”)]
   uuid: Uuid,
   // rest of fields
}

进入全屏模式 退出全屏模式

这使得直接使用 Uuid 类型变得更容易,而无需担心如何将其转换为 BSON。 serde_helpers 模块还引入了其他几种常见策略的函数。如果您对更复杂的映射功能感兴趣,值得阅读有关属性的 Serde 文档。

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐