The Query system
You can retrieve document from the database two ways:
aragog provides an AQL query builder system, allowing safer queries than direct string literals.
For a created object like the following:
#![allow(unused_variables)] fn main() { #[derive(Serialize, Deserialize, Record, Clone)] struct User { first_name: String, last_name: String, age: u16, } let user = User { first_name: "Robert".to_string(), last_name: "Surcouf".to_string(), age: 25, }; DatabaseRecord::create(user, &database_connection).await.unwrap(); }
You can define a query:
#![allow(unused_variables)] fn main() { let query = User::query() .filter(Filter::new( Comparison::field("last_name").equals_str("Surcouf")) .and(Comparison::field("age").greater_than(15)) ); }
Typed querying
Typed querying will allow only one type of document to be retrieved, in this case User collection documents.
In case of corrupted documents they may not be returned, see safe querying for resilient querying
- Through
Record::get:
#![allow(unused_variables)] fn main() { let result = User::get(&query, &database_connection).await.unwrap(); }
- Through
DatabaseRecord::get(requires type):
#![allow(unused_variables)] fn main() { let result :QueryResult<User> = DatabaseRecord::get(&query, &database_connection).await.unwrap(); }
- Through
Query::call(requires type):
#![allow(unused_variables)] fn main() { let result :QueryResult<User> = query.call(&database_connection).await.unwrap() }
Safe querying
safe querying will allow multiple types of document to be retrieved as json objects (UndefinedRecord) and then dynamically parsed.
This version may be slightly slower, but you have a guarantee to retrieve all documents
- Through
Query::raw_call:
#![allow(unused_variables)] fn main() { let result = query.raw_call(&database_connection).await.unwrap() }
- Through
DatabaseAccess::query(requires type):
#![allow(unused_variables)] fn main() { let result = database_connection.query(query).await.unwrap(); }
The QueryResult<UndefinedRecord> provides a get_records method to dynamically retrieve custom Record types.
Batch calls
Each and every query variant shown above have a batched version:
Record::get=>Record::get_in_batchesDatabaseRecord::get=>DatabaseRecord::get_in_batchesQuery::call=>Query::call_in_batchesQuery::raw_call=>Query::raw_call_in_batchesDatabaseAccess::query=>DatabaseAccess::query_in_batches
They will return a QueryCursor instead of a QueryResult allowing to customize the number of returned document and easy iteration through the returned batches.
If you use the
blockingfeature,QueryCursorhas anIteratorimplementation. Otherwise use thenext_batchmethod