#mongo-db #bson #database-driver #nosql #connection-pool

mongodb_cwal

专为无法再等待的人打造的本地MongoDB驱动程序(CWAL)

10个版本

使用旧的Rust 2015

0.6.7 2020年6月9日
0.6.6 2020年3月18日
0.6.4 2020年2月25日
0.6.2 2019年12月4日
0.4.0 2019年11月25日

#8 in #bson

Download history 5/week @ 2024-03-11 13/week @ 2024-03-18 30/week @ 2024-04-01 7/week @ 2024-04-22 8/week @ 2024-05-13 124/week @ 2024-05-20 146/week @ 2024-05-27 18/week @ 2024-06-03 13/week @ 2024-06-10 57/week @ 2024-06-24

90 每月下载量

Apache-2.0

340KB
8K SLoC

欢迎社区贡献!让我们一起使MongoDB的Rust支持变得可用:)

Crates.io docs.rs License

MongoDB CWAL - 为无法再等待的人提供的MongoDB Rust驱动程序

这个Rust驱动程序是从一个不受支持的Rust MongoDB驱动程序原型mongo-rust-driver-prototype中分叉而来的,并添加了补丁以使其适合生产使用。由于官方Rust MongoDB驱动程序尚未推出,我们决定分叉原始版本并对其进行改进。

支持MongoDB 3.x和4.x,包括副本集。

以下是已做的重大变更和修复列表

  • MongoDB 4.x支持
  • 副本集支持
  • R2D2连接池
  • BSON性能优化
  • 修复连接和内存泄漏

安装

依赖项

导入

驱动程序在crates.io上可用。要在代码中使用MongoDB驱动程序,请将bson和mongodb包添加到您的 Cargo.toml 文件中

[dependencies]
mongodb = { package = "mongodb_cwal", version = "0.4" }

或者,您可以使用支持SSL的MongoDB驱动程序。为此,您必须在您的系统上安装OpenSSL。然后,在Cargo.toml中为MongoDB启用 ssl 功能

[dependencies]
mongodb = { package = "mongodb_cwal", version = "0.4", features = ["ssl"] }

然后,在您的代码中导入bson和驱动程序库。

#[macro_use(bson, doc)]
extern crate mongodb;

或者使用Rust 2018

use mongodb::{bson, doc};

示例

以下是一个驱动程序使用的基本示例

use mongodb::{Bson, bson, doc};
use mongodb::{Client, ThreadedClient};
use mongodb::db::ThreadedDatabase;

fn main() {
    let client = Client::connect("localhost", 27017)
        .expect("Failed to initialize standalone client.");

    let coll = client.db("test").collection("movies");

    let doc = doc! {
        "title": "Jaws",
        "array": [ 1, 2, 3 ],
    };

    // Insert document into 'test.movies' collection
    coll.insert_one(doc.clone(), None)
        .ok().expect("Failed to insert document.");

    // Find the document and receive a cursor
    let mut cursor = coll.find(Some(doc.clone()), None)
        .ok().expect("Failed to execute find.");

    let item = cursor.next();

    // cursor.next() returns an Option<Result<Document>>
    match item {
        Some(Ok(doc)) => match doc.get("title") {
            Some(&Bson::String(ref title)) => println!("{}", title),
            _ => panic!("Expected title to be a string!"),
        },
        Some(Err(_)) => panic!("Failed to get next from server!"),
        None => panic!("Server returned no results!"),
    }
}

要使用SSL连接,请使用 ClientOptions::with_sslClientOptions::with_unauthenticated_ssl,然后使用 Client::connect_with_options。之后,客户端可以使用如上方式使用(请注意,服务器必须配置为接受SSL连接,并且您必须生成自己的密钥和证书)

use mongodb::{Bson, bson, doc};
use mongodb::{Client, ClientOptions, ThreadedClient};
use mongodb::db::ThreadedDatabase;

fn main() {
    // Path to file containing trusted server certificates.
    let ca_file = "path/to/ca.crt";
    // Path to file containing client certificate.
    let certificate = "path/to/client.crt";
    // Path to file containing the client private key.
    let key_file = "path/to/client.key";
    // Whether or not to verify that the server certificate is valid. Unless you're just testing out something locally, this should ALWAYS be true.
    let verify_peer = true;

    let options = ClientOptions::with_ssl(ca_file, certificate, key_file, verify_peer);

    let client = Client::connect_with_options("localhost", 27017, options)
        .expect("Failed to initialize standalone client.");

    let coll = client.db("test").collection("movies");

    let doc = doc! {
        "title": "Jaws",
        "array": [ 1, 2, 3 ],
    };

    // Insert document into 'test.movies' collection
    coll.insert_one(doc.clone(), None)
        .ok().expect("Failed to insert document.");

    ...
}

测试

驱动程序测试套件主要由集成测试和行为单元测试组成,依赖于官方的MongoDB规范仓库

最简单的方法是在您的分叉中设置TravisCI来彻底测试驱动程序。然而,如果您想本地测试驱动程序,则需要设置集成和规范测试。

注意:每个集成测试都使用一个独特的数据库/集合,以便测试可以并行化,并在运行前删除其依赖。然而,效果在之后并未清理。

设置集成测试

所有集成测试都在默认的MongoDB端口,27017上运行。在运行测试之前,请确保已设置一个测试数据库来监听该端口。

如果您尚未安装mongodb,请从MongoDB下载中心下载并安装一个版本。您可以在travis配置中查看正在Travis上测试的所有版本的完整列表。

安装后,在27017端口运行MongoDB服务器

mkdir -p ./data/test_db
mongod --dbpath ./data/test_db

设置规格子模块

tests/json/data/specs处拉取规格子模块。

git submodule update --init

运行测试

像常规Rust程序一样运行测试

cargo test --verbose

依赖项

~18–26MB
~396K SLoC