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?;
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