Skip to main content

Querying with Filters

All ekoDB client libraries provide a QueryBuilder for constructing complex queries with filters, sorting, and pagination using a fluent API.

Simple Query

use ekodb_client::{Client, QueryBuilder};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new("https://your-db.ekodb.net", "YOUR_API_KEY")?;

// Find active users
let query = QueryBuilder::new()
.eq("status", "active")
.build();

let result = client.find("users", query).await?;
println!("{:?}", result);
Ok(())
}

Complex Query

Find active users aged 18-65 with gmail addresses, sorted by creation date:

let query = QueryBuilder::new()
.eq("status", "active")
.gte("age", 18)
.lte("age", 65)
.contains("email", "@gmail.com")
.sort_desc("created_at")
.limit(20)
.build();

let result = client.find("users", query).await?;

Logical Operators

OR Query

Find users who are either admins or moderators:

use serde_json::json;

let query = QueryBuilder::new()
.or(vec![
json!({
"type": "Condition",
"content": {
"field": "role",
"operator": "Eq",
"value": "admin"
}
}),
json!({
"type": "Condition",
"content": {
"field": "role",
"operator": "Eq",
"value": "moderator"
}
}),
])
.build();

String Operators

StartsWith

let query = QueryBuilder::new()
.starts_with("name", "Dr. ")
.build();

EndsWith

let query = QueryBuilder::new()
.ends_with("email", ".edu")
.build();

Contains

let query = QueryBuilder::new()
.contains("description", "urgent")
.build();

Pagination

Page through results with skip and limit:

// Page 2 with 20 items per page
let query = QueryBuilder::new()
.eq("status", "active")
.page(2, 20) // skip: 40, limit: 20
.sort_desc("created_at")
.build();

Available Operators

Comparison Operators

MethodOperatorDescription
.eq(field, value)EqEquals
.ne(field, value)NeNot equals
.gt(field, value)GtGreater than
.gte(field, value)GteGreater than or equal
.lt(field, value)LtLess than
.lte(field, value)LteLess than or equal
.in(field, array)InValue in array
.nin(field, array)NotInValue not in array

String Operators

MethodOperatorDescription
.contains(field, substring)ContainsSubstring match
.startsWith(field, prefix)StartsWithPrefix match
.endsWith(field, suffix)EndsWithSuffix match

Logical Operators

MethodDescription
.and(conditions)All conditions must match
.or(conditions)At least one condition must match
.not(condition)Negate a condition

Sorting & Pagination

MethodDescription
.sortAsc(field)Sort ascending
.sortDesc(field)Sort descending
.limit(n)Max results to return
.skip(n)Results to skip
.page(page, size)Convenience method for pagination

Query Expression Reference

For the complete reference including all operators, JSON structure, and advanced patterns, see:

Query Expressions Reference

Complete QueryBuilder Examples

QueryBuilder examples - Complex queries with filtering, sorting, and pagination:

  • Rust: client_query_builder.rs
  • Python: client_query_builder.py
  • TypeScript: client_query_builder.ts
  • JavaScript: client_query_builder.js
  • Go: client_query_builder.go
  • Kotlin: ClientQueryBuilder.kt

Next Steps

Need Help?