新的 MongoDB Rust 驱动程序 0.1.0

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

今天,我们发布了用于 Rust 编程语言的 实验性 MongoDB 驱动程序 0.1.0 版。这是 Rust 0.7 驱动程序的精神继承者,两年前由之前的实习生 Jao-ke Chin-Lee Jed Estep 构建。在那两年里,Rust 发生了翻天覆地的变化,成为一种更快、更安全、并发性更强、对开发人员更易用的语言。我们很高兴将我们的驱动程序发布到荒野中,并期待来自 Rust 和 MongoDB 社区的反馈。

关于生锈

Rust 是 Mozilla 目前正在开发的一种新的面向系统的编程语言。正式地,它被描述为一种“运行速度极快,几乎可以防止所有段错误,并保证线程安全”的语言。其强大的类型和内存安全功能在编译时运行,消除了运行时悬空指针和数据竞争等常见失误,同时保持了低级语言的典型性能。

此外,它还具有来自命令式、函数式和面向对象编程语言的元素,提供高级抽象,如基于特征的泛型、模式匹配、类型推断和自动内存管理,而运行时成本很小甚至没有。随着语言的不断发展,用原生 Rust 编写的 MongoDB 驱动程序的可用性将 Rust 和 MongoDB 都暴露给了新的受众。

新的 MongoDB Rust 驱动程序

该驱动程序是一个开源的、Apache 许可的库,完全用 Rust 实现。当前这一代 MongoDB 驱动程序的用户会感觉很熟悉,这些驱动程序已经过重建以符合越来越多的已发布规范集合,指导从面向用户的 API 到服务器监控和选择的内部机制的所有内容。该驱动程序在 crates.io 上以 mongodb 的 形式提供。

安装

要将驱动程序用作库依赖项,请将 bson 和 mongodb crate 添加到 Cargo.toml 中:

之后,您可以在代码中导入 crate 并自由使用它们。

用法

连接到 MongoDB

要连接到 MongoDB 服务器,我们需要创建一个客户端。我们可以像这样直接连接到 localhost:27017 上的服务器:

我们还可以连接到更复杂的拓扑结构,例如副本集或分片集群:

使用 连接字符串 连接将触发对服务器的自动监视,允许驱动程序发现服务器集中的其他服务器并对部署拓扑中的更改做出反应。

通过 ClientOptions 结构可以使用更复杂的选项,允许您指定用于命令监视的日志文件、复杂拓扑的读取首选项和写入关注点,以及服务器超时和心跳监视间隔等其他配置选项。

数据库

现在我们已经连接到我们的服务器,让我们在“电影”数据库中创建一个新的上限集合。我们可以通过数据库 API 轻松地做到这一点:

如果数据库使用 SCRAM-SHA-1 身份验证措施进行保护,我们可以在执行操作之前通过驱动程序对自己进行授权:

此时其他身份验证措施尚未实施。我们期待在未来支持完整的身份验证规范。

增删改查

现在我们可以与我们的新收藏互动。对于那些在 MongoDB 生态系统中使用过其他驱动程序的人来说,在 Rust 中与数据交互会感觉非常熟悉。我们可以做一些事情,比如将多个文档插入我们的集合中:

除了基本的 CRUD 操作外,该驱动程序还提供了一个批量写入 API,用于一次高效地执行多个写入操作。

光标

来自数据库的查询的返回类型是 Result<Cursor> 。这意味着如果查询成功完成,将返回一个 Cursor ,否则将返回一个 Error 。检查查询是否成功的最常见方法是对结果进行 模式匹配

Cursor 类实现了 Iterator 特性。迭代类型是 Result<bson::Document> 。您可以使用“for”循环遍历文档:

您还可以在游标上使用任何 Iterator 方法:

关税——一个进出口应用程序

为了测试我们的驱动程序,我们使用它编写了一些应用程序。其中之一, tariff ,是一些基本驱动程序用法的一个很好的例子。

描述

tariff 是 MongoDB 数据库的导入/导出工具。它能够将单个集合或整个数据库转储到 JSON 文件中,并导入导出生成的文件。默认情况下, tariff 将从它连接的任何数据库读取,但它也可以从副本集中的辅助数据库而不是主数据库读取。

安装

要安装 tariff ,请克隆 github 存储库,然后使用 cargo 构建应用程序:

用法

执行上述步骤后,t tariff 文件将位于 target/release/tariff 中。要查看可用参数列表,您可以运行 tariff --help

例子
注意:以下所有示例均假定它们是从与 tariff 二进制文件相同的目录中运行的。您可能需要在名称前加上路径;例如,要从项目根目录运行,您需要使用 target/release/tariff

- 将“baseball”数据库中的集合“players”导出到文件“players.json”:
- tariff -e players.json -d baseball -c players

- 将整个“棒球”数据库导出到文件“baseball.json”:
- tariff -x baseball.json -d baseball

- 将存储在“players.json”中的集合导入数据库“athletes”中的集合“baseball”:
- tariff -i players.json -d athletes -c baseball

- 将存储在“baseball.json”中的所有集合导入数据库“favorite _ sport”:
- tariff -m baseball.json -d favorite sport

- 从副本集中的一个辅助节点而不是主要节点导出集合:
- tariff -e players.json -d mlb -c players --secondary

- 将集合导入到在端口 3000 上运行的数据库:
- tariff -i players.json -d atheletes -b baseball -p 3000

司机代码
要了解 tariff 如何使用 Rust 驱动程序,您可以查看文件 src/client.rs

资源

要了解有关驱动程序的更多信息,请访问 bson 库 驱动程序本身 的 github 存储库。文档可在 github 页面 上找到。我们强烈建议您与驱动程序一起玩,并以 问题 拉取请求 的形式提供反馈!

要了解有关 Rust 的更多信息,请查看我们在 MongoDB 总部举办的 Rust NYC 聚会的 幻灯片 。以下是我们使用和推荐的在线资源的列举,以更加熟悉 Rust 并声称对该语言的内部工作原理有更深入的了解:

感谢 Rust 社区提供的所有工具和资源,让您可以轻松掌握和熟悉这门语言,也感谢所有与我们互动过的贡献者,他们让我们的生活变得更轻松。最后感谢 MongoDB 的所有优秀人员,他们使实习计划变得特别,特别是我们的导师 Daniel Alabi 和 Valeri Karpov,感谢他们的指导和支持。

注意:最初出现在 Sam Rossi 和 Kevin Yeh 撰写的 MongoDB 博客上。

关于作者

Sam Rossi 是宾夕法尼亚大学计算机科学专业的大四学生。他喜欢进行系统编程、编写编译器和解释器以及解决一般有趣的问题。

Kevin Yeh 是德克萨斯大学奥斯汀分校的一名硕士生,今年夏天是 MongoDB 驱动程序团队的实习生。