Skip to content

Basic CRUD Examples ​

This guide covers fundamental Create, Read, Update, and Delete operations in PocketDB.

Setup ​

rust
use pocketdb::{Database, doc, filter, PocketValue};
use pocketdb::query::UpdateExpression;

fn main() -> pocketdb::Result<()> {
    let db = Database::open("example.pdb")?;
    let users = db.collection("users")?;

    // ... examples below ...

    Ok(())
}

Create — Insert Documents ​

Single Insert ​

rust
let id = users.insert(doc! {
    "name" => "Alice",
    "age" => 30,
    "email" => "alice@example.com",
    "active" => true
})?;

println!("Inserted: {}", id);

Bulk Insert ​

rust
let docs = vec![
    doc! { "name" => "Alice", "age" => 30, "role" => "admin" },
    doc! { "name" => "Bob", "age" => 25, "role" => "user" },
    doc! { "name" => "Charlie", "age" => 35, "role" => "user" },
    doc! { "name" => "Diana", "age" => 28, "role" => "admin" },
];

let ids = users.insert_many(docs)?;
println!("Inserted {} users", ids.len());

Read — Query Documents ​

Find One ​

rust
// By name
let alice = users.find_one(&filter! { "name" => == "Alice" });

// By ID
use pocketdb::PocketValue;
let user = users.find_one(&filter! { "_id" => PocketValue::ObjectId(id) });

match user {
    Some(doc) => println!("Found: {}", doc),
    None => println!("Not found"),
}

Find with Filters ​

rust
// All active users
let active = users.find(filter! { "active" => == true })
    .run(&users.all_documents())?;

for user in &active {
    println!("{}", user.get("name").unwrap());
}

Find with Sorting and Pagination ​

rust
use pocketdb::query::SortDirection;

let page = users.find(filter! { "active" => == true })
    .sort("name", SortDirection::Asc)
    .skip(0)    // offset
    .limit(10)  // page size
    .run(&users.all_documents())?;

Count Documents ​

rust
let total = users.count(&filter::always_true())?;
let admins = users.count(&filter! { "role" => == "admin" })?;
println!("Total: {}, Admins: {}", total, admins);

Distinct Values ​

rust
let roles = users.distinct("role", &filter::always_true())?;
for role in &roles {
    println!("Role: {}", role);
}

Update — Modify Documents ​

Update One ​

rust
users.update_one(
    &filter! { "name" => == "Alice" },
    &UpdateExpression::new()
        .set("email", PocketValue::String("alice@newdomain.com".to_string()))
        .set("age", PocketValue::Int(31)),
)?;

Update Many ​

rust
// Mark all users over 30 as "senior"
users.update_many(
    &filter! { "age" => > 30 },
    &UpdateExpression::new().set("level", PocketValue::String("senior".to_string())),
)?;

Increment Fields ​

rust
// Increment age by 1
users.update_one(
    &filter! { "name" => == "Alice" },
    &UpdateExpression::new().inc("age", PocketValue::Int(1)),
)?;

Upsert ​

rust
// Update if exists, otherwise insert
let id = users.upsert(
    &filter! { "email" => == "bob@example.com" },
    &doc! { "name" => "Bob", "email" => "bob@example.com", "age" => 25 },
)?;

Delete — Remove Documents ​

Delete One ​

rust
let deleted = users.delete_one(&filter! { "name" => == "Charlie" })?;
println!("Deleted: {}", deleted);

Delete Many ​

rust
let count = users.delete_many(&filter! { "active" => == false })?;
println!("Removed {} inactive users", count);

Replace Documents ​

Replace an entire document while keeping its _id:

rust
users.replace_one(
    &filter! { "name" => == "Bob" },
    &doc! { "name" => "Bob", "email" => "bob@new.com", "age" => 26 },
)?;

Bulk Operations ​

Execute mixed operations atomically:

rust
use pocketdb::collection::BulkOp;

let ops = vec![
    BulkOp::Insert(doc! { "name" => "Eve", "age" => 22 }),
    BulkOp::UpdateOne(
        filter! { "name" => == "Alice" },
        UpdateExpression::new().inc("age", PocketValue::Int(1)),
    ),
    BulkOp::DeleteOne(filter! { "name" => == "Charlie" }),
];

let affected = users.bulk_write(ops)?;

Database Management ​

List Collections ​

rust
for name in db.list_collections() {
    println!("Collection: {}", name);
}

Database Stats ​

rust
let stats = db.stats();
println!("Pages: {}", stats.page_count);
println!("Free pages: {}", stats.free_pages);
println!("Collections: {}", stats.collection_count);
println!("File size: {} bytes", stats.file_size);

Drop Collection ​

rust
db.drop_collection("old_data")?;

Released under the MIT License. Built by Muhammad Fiaz.