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 中使用
210KB
5K SLoC
轻量级嵌入式数据库
LEDB 是实现简单但高效、轻量但强大的文档存储的尝试。
缩写 LEDB 可以被视为 Lightweight Embedded DB,也可以是 Low End DB,还可以是 Literium Engine DB,或者 LitE DB 等。
链接
- crates.io上的ledb Crate
- docs.rs上的ledb API文档
- crates.io上的ledb-types Crate
- docs.rs上的ledb-types API文档
- crates.io上的ledb-derive Crate
- docs.rs上的ledb-derive API文档
- crates.io上的ledb-actix Crate
- docs.rs上的ledb-actix API文档
- npmjs.com上的ledb NodeJS 扩展
主要特性
- 处理实现 serde 的
Serialize
和Deserialize
特性的文档。 - 使用自增整数主键识别文档。
- 使用唯一或重复键索引文档的任何字段。
- 使用索引字段或主键搜索和排序文档。
- 使用字段比较和逻辑运算的复杂过滤器选择文档。
- 使用丰富的修饰符更新文档。
- 将文档存储到称为集合的独立存储中。
- 灵活的
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