Skip to main content

QueryBuilder

Struct QueryBuilder 

Source
pub struct QueryBuilder<'a> { /* private fields */ }
Expand description

Builder for creating and executing document queries.

QueryBuilder uses a fluent interface pattern to construct and execute queries against Aurora collections.

§Examples

// Query for active premium users
let premium_users = db.query("users")
    .filter(|f| f.eq("status", "active") && f.eq("account_type", "premium"))
    .order_by("created_at", false)
    .limit(10)
    .collect()
    .await?;

Implementations§

Source§

impl<'a> QueryBuilder<'a>

Source

pub fn new(db: &'a Aurora, collection: &str) -> Self

Create a new query builder for the specified collection

§Examples

let query = db.query(“users”);

Source

pub fn filter<F>(self, filter_fn: F) -> Self
where F: Fn(&FilterBuilder<'_, '_>) -> bool + Send + Sync + 'a,

Add a filter function to the query

§Examples

let active_users = db.query(“users”) .filter(|f| f.eq(“status”, “active”)) .collect() .await?;

Source

pub fn order_by(self, field: &str, ascending: bool) -> Self

Sort results by a field (ascending or descending)

§Parameters
  • field - The field to sort by
  • ascending - true for ascending order, false for descending
§Examples
// Sort by age ascending
.order_by("age", true)

// Sort by creation date descending (newest first)
.order_by("created_at", false)
Source

pub fn limit(self, limit: usize) -> Self

Limit the number of results returned

§Examples
// Get at most 10 results
.limit(10)
Source

pub fn offset(self, offset: usize) -> Self

Skip a number of results (for pagination)

§Examples
// For pagination: skip the first 20 results and get the next 10
.offset(20).limit(10)
Source

pub fn select(self, fields: &[&str]) -> Self

Select only specific fields to return

§Examples
// Only return name and email fields
.select(&["name", "email"])
Source

pub fn debounce(self, duration: Duration) -> Self

Set debounce/throttle interval for reactive queries (watch)

When watching a query, updates will be batched and emitted at most once per interval. This prevents overwhelming the UI with high-frequency updates. Events are deduplicated by document ID, keeping only the latest state.

§Examples
use std::time::Duration;

// Rate-limit to max 10 updates per second
let mut watcher = db.query("logs")
    .filter(|f| f.eq("level", "ERROR"))
    .debounce(Duration::from_millis(100))
    .watch()
    .await?;
Source

pub async fn collect(self) -> Result<Vec<Document>>

Execute the query and collect the results

§Returns

A vector of documents matching the query criteria

§Examples

let results = db.query(“products”) .filter(|f| f.lt(“price”, 100)) .collect() .await?;

Source

pub async fn watch(self) -> Result<QueryWatcher>
where 'a: 'static,

Watch the query for real-time updates

Returns a QueryWatcher that streams live updates when documents are added, removed, or modified in ways that affect the query results. Perfect for building reactive UIs, live dashboards, and real-time applications.

§Performance
  • Zero overhead for queries without watchers
  • Updates delivered asynchronously via channels
  • Automatic filtering - only matching changes are emitted
  • Memory efficient - only tracks matching documents
§Requirements

This method requires the QueryBuilder to have a ’static lifetime, which means the database reference must also be ’static (e.g., Arc).

§Examples
use aurora_db::{Aurora, types::Value};
use std::sync::Arc;

let db = Arc::new(Aurora::open("mydb.db")?);

// Basic reactive query - watch active users
let mut watcher = db.query("users")
    .filter(|f| f.eq("active", Value::Bool(true)))
    .watch()
    .await?;

// Receive updates in real-time
while let Some(update) = watcher.next().await {
    match update {
        QueryUpdate::Added(doc) => {
            println!("New active user: {}", doc.id);
        },
        QueryUpdate::Removed(doc) => {
            println!("User deactivated: {}", doc.id);
        },
        QueryUpdate::Modified { old, new } => {
            println!("User updated: {} -> {}", old.id, new.id);
        },
    }
}
§Real-World Use Cases

Live Leaderboard:

// Watch top players by score
let mut leaderboard = db.query("players")
    .filter(|f| f.gte("score", Value::Int(1000)))
    .watch()
    .await?;

tokio::spawn(async move {
    while let Some(update) = leaderboard.next().await {
        // Update UI with new rankings
        broadcast_to_clients(&update).await;
    }
});

Activity Feed:

// Watch recent posts for a user's feed
let mut feed = db.query("posts")
    .filter(|f| f.eq("author_id", user_id))
    .watch()
    .await?;

// Stream updates to WebSocket
while let Some(update) = feed.next().await {
    match update {
        QueryUpdate::Added(post) => {
            websocket.send(json!({"type": "new_post", "post": post})).await?;
        },
        _ => {}
    }
}

Real-Time Dashboard:

// Watch critical metrics
let mut alerts = db.query("metrics")
    .filter(|f| f.gt("cpu_usage", Value::Float(80.0)))
    .watch()
    .await?;

tokio::spawn(async move {
    while let Some(update) = alerts.next().await {
        if let QueryUpdate::Added(metric) = update {
            // Alert on high CPU usage
            send_alert(format!("High CPU: {:?}", metric)).await;
        }
    }
});

Collaborative Editing:

// Watch document for changes from other users
let doc_id = "doc-123";
let mut changes = db.query("documents")
    .filter(|f| f.eq("id", doc_id))
    .watch()
    .await?;

tokio::spawn(async move {
    while let Some(update) = changes.next().await {
        if let QueryUpdate::Modified { old, new } = update {
            // Merge changes from other editors
            apply_remote_changes(&old, &new).await;
        }
    }
});

Stock Ticker:

// Watch price changes
let mut price_watcher = db.query("stocks")
    .filter(|f| f.eq("symbol", "AAPL"))
    .watch()
    .await?;

while let Some(update) = price_watcher.next().await {
    if let QueryUpdate::Modified { old, new } = update {
        if let (Some(old_price), Some(new_price)) =
            (old.data.get("price"), new.data.get("price")) {
            println!("AAPL: {} -> {}", old_price, new_price);
        }
    }
}
§Multiple Watchers Pattern
// Watch multiple queries concurrently
let mut high_priority = db.query("tasks")
    .filter(|f| f.eq("priority", Value::String("high".into())))
    .watch()
    .await?;

let mut urgent = db.query("tasks")
    .filter(|f| f.eq("status", Value::String("urgent".into())))
    .watch()
    .await?;

tokio::spawn(async move {
    loop {
        tokio::select! {
            Some(update) = high_priority.next() => {
                println!("High priority: {:?}", update);
            },
            Some(update) = urgent.next() => {
                println!("Urgent: {:?}", update);
            },
        }
    }
});
§Important Notes
  • Requires Arc for ’static lifetime
  • Updates are delivered asynchronously
  • Watcher keeps running until dropped
  • Only matching documents trigger updates
  • Use tokio::spawn to process updates in background
§See Also
  • Aurora::listen() for collection-level change notifications
  • QueryWatcher::next() to receive the next update
  • QueryWatcher::try_next() for non-blocking checks
Source

pub async fn first_one(self) -> Result<Option<Document>>

Get only the first matching document or None if no matches

§Examples

let user = db.query(“users”) .filter(|f| f.eq(“email”, “jane@example.com”)) .first_one() .await?;

Source

pub async fn count(self) -> Result<usize>

Count the number of documents matching the query

§Examples

let active_count = db.query(“users”) .filter(|f| f.eq(“status”, “active”)) .count() .await?;

Source

pub async fn update(self, updates: HashMap<&str, Value>) -> Result<usize>

Update documents matching the query with new field values

§Returns

The number of documents updated

§Examples

let updated = db.query(“products”) .filter(|f| f.lt(“stock”, 5)) .update([ (“status”, Value::String(“low_stock”.to_string())), (“needs_reorder”, Value::Bool(true)) ].into_iter().collect()) .await?;

Source

pub async fn delete(self) -> Result<usize>

Delete documents matching the query

§Returns

The number of documents deleted

§Examples
let deleted = db.query("users")
    .filter(|f| f.eq("active", false))
    .delete()
    .await?;

Delete documents matching the query

§Returns

The number of documents deleted

§Note

Deletions are not atomic. If an error occurs during deletion, some documents may have been deleted while others remain. For atomic batch operations, consider using transactions.

§Examples
// Delete all inactive users
let deleted = db.query("users")
    .filter(|f| f.eq("status", "inactive"))
    .delete()
    .await?;
println!("Deleted {} users", deleted);

Auto Trait Implementations§

§

impl<'a> Freeze for QueryBuilder<'a>

§

impl<'a> !RefUnwindSafe for QueryBuilder<'a>

§

impl<'a> Send for QueryBuilder<'a>

§

impl<'a> Sync for QueryBuilder<'a>

§

impl<'a> Unpin for QueryBuilder<'a>

§

impl<'a> !UnwindSafe for QueryBuilder<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

Source§

fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The type for metadata in pointers and references to Self.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more