43 releases (21 stable)

4.4.1 Feb 29, 2024
4.4.0 May 30, 2023
4.2.0 Apr 24, 2023
3.5.2 Mar 6, 2023
0.4.2 Nov 28, 2020

#356 in Database interfaces

Download history 372/week @ 2024-02-25 68/week @ 2024-03-03 86/week @ 2024-03-10 86/week @ 2024-03-17 45/week @ 2024-03-24 90/week @ 2024-03-31 25/week @ 2024-04-07 49/week @ 2024-04-14 51/week @ 2024-04-21 23/week @ 2024-04-28 28/week @ 2024-05-05 37/week @ 2024-05-12 60/week @ 2024-05-19 23/week @ 2024-05-26 32/week @ 2024-06-02 18/week @ 2024-06-09

135 downloads per month
Used in 2 crates

MPL-2.0 license

1MB
12K SLoC

PoloDB Core

Introduction

PoloDB is a library written in Rust that implements a lightweight MongoDB.

Manual

Github: PoloDB/PoloDB

Website: polodb.org


lib.rs:

PoloDB is an embedded JSON-based database.

PoloDB is a library written in Rust that implements a lightweight MongoDB. PoloDB has no dependency(except for libc), so it can be easily run on most platform(thanks for Rust Language). The data of PoloDB is stored in a file. The file format is stable, cross-platform, and backwards compaitible. The API of PoloDB is very similar to MongoDB. It's very easy to learn and use.

Tutorials

Usage

The Database structure provides all the API to get access to the DB file.

Open a local file

use polodb_core::Database;
let db = Database::open_file(db_path).unwrap();

Open a memory database

use polodb_core::Database;

let db = Database::open_memory().unwrap();

Example

use polodb_core::Database;
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
struct Book {
   title: String,
   author: String,
}

let db = Database::open_file(db_path).unwrap();
let collection = db.collection("books");
collection.insert_one(Book {
   title: "The Three-Body Problem".to_string(),
   author: "Liu Cixin".to_string(),
}).unwrap();

Inserting documents into a collection

use polodb_core::Database;
use polodb_core::bson::{Document, doc};

let db = Database::open_memory().unwrap();
let collection = db.collection::<Document>("books");

let docs = vec![
    doc! { "title": "1984", "author": "George Orwell" },
    doc! { "title": "Animal Farm", "author": "George Orwell" },
    doc! { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
];
collection.insert_many(docs).unwrap();

Finding documents in a collection

use polodb_core::Database;
use polodb_core::bson::{Document, doc};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Book {
   title: String,
   author: String,
}

let db = Database::open_memory().unwrap();
let collection = db.collection::<Book>("books");

let docs = vec![
    Book { title: "1984".to_string(), author: "George Orwell".to_string() },
    Book { title: "Animal Farm".to_string(), author: "George Orwell".to_string() },
    Book { title: "The Great Gatsby".to_string(), author: "F. Scott Fitzgerald".to_string() },
];
collection.insert_many(docs).unwrap();

let books = collection.find(None).unwrap();
for book in books {
    println!("name: {:?}", book);
}

Session

A ClientSession represents a logical session used for ordering sequential operations.

You an manually start a transaction by ClientSession::start_transaction method. If you don't start it manually, a transaction will be automatically started in your every operation.

Example

use polodb_core::Database;
use polodb_core::bson::{Document, doc};

let db = Database::open_file(db_path).unwrap();

let mut session = db.start_session().unwrap();
session.start_transaction(None).unwrap();

let collection = db.collection::<Document>("books");

let docs = vec![
    doc! { "title": "1984", "author": "George Orwell" },
    doc! { "title": "Animal Farm", "author": "George Orwell" },
    doc! { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
];
collection.insert_many_with_session(docs, &mut session).unwrap();

session.commit_transaction().unwrap();

Dependencies

~19MB
~347K SLoC