Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Inicio Rapido

Esta guia te lleva por las funcionalidades principales de RouchDB en 5 minutos.

Instalacion como libreria

Agrega RouchDB a tu proyecto:

[dependencies]
rouchdb = "0.3"
tokio = { version = "1", features = ["full"] }
serde_json = "1"

Herramienta de linea de comandos

RouchDB incluye un CLI para inspeccionar y consultar bases de datos redb:

cargo install --path crates/rouchdb-cli

Ejemplos de uso:

# Informacion de la base de datos
rouchdb info mydb.redb

# Obtener un documento por ID
rouchdb get mydb.redb user:alice

# Listar todos los documentos
rouchdb all-docs mydb.redb --include-docs

# Consulta Mango
rouchdb find mydb.redb --selector '{"age": {"$gte": 30}}'

# Exportar todos los documentos como JSON
rouchdb dump mydb.redb --pretty

# Crear o actualizar un documento
rouchdb put mydb.redb user:alice '{"name":"Alice","age":30}'
rouchdb put mydb.redb user:alice '{"name":"Alice","age":31}' --rev 1-abc

# Upsert — obtiene el rev actual automaticamente, crea si no existe
rouchdb put mydb.redb user:alice '{"name":"Alice","age":32}' --force

# Crear un documento con ID auto-generado
rouchdb post mydb.redb '{"name":"Bob","age":25}'

# Eliminar un documento
rouchdb delete mydb.redb user:alice --rev 2-def

# Importar documentos desde un archivo JSON
rouchdb import mydb.redb docs.json

# Replicar a CouchDB
rouchdb replicate mydb.redb http://admin:password@localhost:5984/mydb

Servidor HTTP

RouchDB incluye un servidor HTTP compatible con CouchDB con la interfaz web Fauxton:

# Instalar el servidor
cargo install --path crates/rouchdb-server

# Descargar Fauxton (opcional, para la interfaz web)
bash scripts/download-fauxton.sh

# Iniciar el servidor
rouchdb-server mydb.redb --port 5984

# Abrir Fauxton en el navegador
open http://localhost:5984/_utils/

El servidor expone una API REST compatible con CouchDB — documentos, consultas, feed de cambios, attachments, seguridad, design docs y mas — asi que cualquier cliente CouchDB (Fauxton, PouchDB, curl) puede conectarse.

Crear una base de datos

use rouchdb::Database;

#[tokio::main]
async fn main() -> rouchdb::Result<()> {
    // En memoria (datos se pierden al soltar — ideal para pruebas)
    let db = Database::memory("mydb");

    // Persistente (almacenado en disco via redb)
    // let db = Database::open("mydb.redb", "mydb")?;

    // CouchDB remoto
    // let db = Database::http("http://admin:password@localhost:5984/mydb");

    Ok(())
}

Crear y leer documentos

use rouchdb::Database;

#[tokio::main]
async fn main() -> rouchdb::Result<()> {
    let db = Database::memory("mydb");

    // Crear un documento
    let result = db.put("user:alice", serde_json::json!({
        "name": "Alice",
        "email": "alice@example.com",
        "age": 30
    })).await?;

    println!("Creado con rev: {}", result.rev.unwrap());

    // Leerlo de vuelta
    let doc = db.get("user:alice").await?;
    println!("Nombre: {}", doc.data["name"]); // "Alice"

    Ok(())
}

Actualizar y eliminar

Cada actualizacion requiere la revision actual para prevenir conflictos:

use rouchdb::Database;

#[tokio::main]
async fn main() -> rouchdb::Result<()> {
    let db = Database::memory("mydb");

    // Crear
    let r1 = db.put("user:alice", serde_json::json!({"name": "Alice", "age": 30})).await?;
    let rev = r1.rev.unwrap();

    // Actualizar (debe proveer la rev actual)
    let r2 = db.update("user:alice", &rev, serde_json::json!({
        "name": "Alice",
        "age": 31
    })).await?;

    // Eliminar (debe proveer la rev actual)
    let rev2 = r2.rev.unwrap();
    db.remove("user:alice", &rev2).await?;

    Ok(())
}

Consultas con Mango

Encuentra documentos que coincidan con un selector:

use rouchdb::{Database, FindOptions};

#[tokio::main]
async fn main() -> rouchdb::Result<()> {
    let db = Database::memory("mydb");

    db.put("alice", serde_json::json!({"name": "Alice", "age": 30})).await?;
    db.put("bob", serde_json::json!({"name": "Bob", "age": 25})).await?;
    db.put("carol", serde_json::json!({"name": "Carol", "age": 35})).await?;

    // Encontrar usuarios mayores de 28
    let result = db.find(FindOptions {
        selector: serde_json::json!({"age": {"$gte": 28}}),
        ..Default::default()
    }).await?;

    for doc in &result.docs {
        println!("{}: edad {}", doc["name"], doc["age"]);
    }
    // Alice: edad 30
    // Carol: edad 35

    Ok(())
}

Sincronizar dos bases de datos

use rouchdb::Database;

#[tokio::main]
async fn main() -> rouchdb::Result<()> {
    let local = Database::memory("local");
    let remote = Database::memory("remote");

    // Agregar datos a cada lado
    local.put("doc1", serde_json::json!({"desde": "local"})).await?;
    remote.put("doc2", serde_json::json!({"desde": "remote"})).await?;

    // Sincronizacion bidireccional
    let (push, pull) = local.sync(&remote).await?;
    println!("Push: {} docs escritos", push.docs_written);
    println!("Pull: {} docs escritos", pull.docs_written);

    // Ambas bases de datos ahora tienen ambos documentos
    let info = local.info().await?;
    println!("Local tiene {} docs", info.doc_count); // 2

    Ok(())
}

Siguientes pasos