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>
impl<'a> QueryBuilder<'a>
Sourcepub fn filter<F>(self, filter_fn: F) -> Self
pub fn filter<F>(self, filter_fn: F) -> Self
Add a filter function to the query
§Examples
let active_users = db.query(“users”) .filter(|f| f.eq(“status”, “active”)) .collect() .await?;
Sourcepub fn offset(self, offset: usize) -> Self
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)Sourcepub fn select(self, fields: &[&str]) -> Self
pub fn select(self, fields: &[&str]) -> Self
Select only specific fields to return
§Examples
// Only return name and email fields
.select(&["name", "email"])Sourcepub fn debounce(self, duration: Duration) -> Self
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?;Sourcepub async fn watch(self) -> Result<QueryWatcher>where
'a: 'static,
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 notificationsQueryWatcher::next()to receive the next updateQueryWatcher::try_next()for non-blocking checks
Sourcepub async fn first_one(self) -> Result<Option<Document>>
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?;
Sourcepub async fn count(self) -> Result<usize>
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?;
Sourcepub async fn update(self, updates: HashMap<&str, Value>) -> Result<usize>
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?;
Sourcepub async fn delete(self) -> Result<usize>
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> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more