5个版本 (3个破坏性版本)

0.4.0 2020年6月11日
0.3.0 2019年9月6日
0.2.0 2018年10月27日
0.1.1 2018年10月1日
0.1.0 2018年9月28日

#1852 in 数据库接口


2 crates 中使用

MIT 许可证

210KB
5K SLoC

轻量级嵌入式数据库

License: MIT Travis-CI Build Status Appveyor Build status Crates.io Package Docs.rs API Documentation

LEDB 是实现简单但高效、轻量但强大的文档存储的尝试。

缩写 LEDB 可以被视为 Lightweight Embedded DB,也可以是 Low End DB,还可以是 Literium Engine DB,或者 LitE DB 等。

主要特性

  • 处理实现 serdeSerializeDeserialize 特性的文档。
  • 使用自增整数主键识别文档。
  • 使用唯一或重复键索引文档的任何字段。
  • 使用索引字段或主键搜索和排序文档。
  • 使用字段比较和逻辑运算的复杂过滤器选择文档。
  • 使用丰富的修饰符更新文档。
  • 将文档存储到称为集合的独立存储中。
  • 灵活的 query! 宏,有助于编写清晰和可读的查询。
  • 使用 LMDB 作为文档存储和索引引擎的后端。

使用示例

use serde::{Serialize, Deserialize};
use ledb::{Options, Storage, IndexKind, KeyType, Filter, Comp, Order, OrderKind, Primary};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Document)]
struct MyDoc {
    #[document(primary)]
    id: Option<Primary>,
    title: String,
    #[document(index)]
    tag: Vec<String>,
    #[document(unique)]
    timestamp: u32,
}

fn main() {
    let db_path = ".test_dbs/my_temp_db";
    let _ = std::fs::remove_dir_all(&db_path);

    // Open storage
    let storage = Storage::new(&db_path, Options::default()).unwrap();

    // Get collection
    let collection = storage.collection("my-docs").unwrap();

    // Ensure indexes
    query!(index for collection
        title str unique,
        tag str,
        timestamp int unique,
    ).unwrap();

    // Insert JSON document
    let first_id = query!(insert into collection {
        "title": "First title",
        "tag": ["some tag", "other tag"],
        "timestamp": 1234567890,
    }).unwrap();

    // Insert typed document
    let second_id = collection.insert(&MyDoc {
        title: "Second title".into(),
        tag: vec![],
        timestamp: 1234567657,
    }).unwrap();

    // Find documents
    let found_docs = query!(
        find MyDoc in collection
        where title == "First title"
    ).unwrap().collect::<Result<Vec<_>, _>>().unwrap();

    // Update documents
    let n_affected = query!(
        update in collection modify title = "Other title"
        where title == "First title"
    ).unwrap();

    // Find documents with descending ordering
    let found_docs = query!(
        find MyDoc in collection order desc
    ).unwrap().collect::<Result<Vec<_>, _>>().unwrap();

    // Remove documents
    let n_affected = query!(
        remove from collection where title == "Other title"
    ).unwrap();
}

依赖项

~5–7MB
~133K SLoC