3个版本
| 0.2.2 | 2020年11月3日 | 
|---|---|
| 0.2.1 | 2020年11月2日 | 
| 0.1.5 |  | 
#2572 in 数据库接口
10KB
220 行
Meshuganah
官方Mongodb Rust驱动程序的一个强类型ODM,提供易于使用的抽象。
use meshuganah::GenericRepository;
use meshuganah::RepositoryTrait;
use serde::{Deserialize, Serialize};
use mongodb::bson;
use futures::stream::StreamExt;
#[derive(Debug, Deserialize, Serialize)]
pub struct Species {
    #[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
    pub id: Option<bson::oid::ObjectId>,
    pub name: String,
    pub category: String,
    pub taxonomy: String,
}
unsafe impl Send for Species {}
impl Model for Species {
    const COLLECTION_NAME: &'static str = "species";
    fn get_id(&self) -> Option<bson::oid::ObjectId> {
        self.id.clone()
    }
    fn set_id(&mut self, oid: bson::oid::ObjectId) {
        self.id = Some(oid);
    }
}
let me = Species {
            id: None,
            name: "some_name".to_string(),
            category: "some_category".to_string(),
            taxonomy: "some_taxonomy".to_string(),
};
let database = mongodb::Client::with_uri_str("mongodb://:27017/")
            .await
            .unwrap()
            .database("database_name");
let repository = GenericRepository::<Species>::new(database).await;
// Inserting a document
repository.add_item(None, me).await;
// Find single document
let found = repository.find_one(None, None).await.unwrap();
// Find multiple documents
let mut cursor = repository.find(None, None).await.unwrap();
while let Some(item) = cursor.next().await {
    println!("{:?}", item);
}
还需要完成的工作
- 错误处理
- 迁移
- 索引
- 以类型安全的方式扩展基础客户端的更多功能
依赖项
~28–40MB
~761K SLoC