| Crates.io | prax-mongodb |
| lib.rs | prax-mongodb |
| version | 0.5.0 |
| created_at | 2025-12-29 01:17:33.556582+00 |
| updated_at | 2026-01-07 18:39:36.111504+00 |
| description | MongoDB database driver for Prax ORM |
| homepage | |
| repository | https://github.com/pegasusheavy/prax-orm |
| max_upload_size | |
| id | 2009746 |
| size | 182,003 |
MongoDB query engine for Prax ORM.
prax-mongodb provides an async MongoDB backend using the official mongodb Rust driver with built-in connection pooling.
use prax_mongodb::{MongoClient, FilterBuilder, doc};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a client
let client = MongoClient::builder()
.uri("mongodb://localhost:27017")
.database("mydb")
.max_pool_size(10)
.build()
.await?;
// Get a typed collection
let users = client.collection::<User>("users");
// Insert a document
users.insert_one(User { name: "Alice".into(), age: 30 }).await?;
// Query with filter builder
let filter = FilterBuilder::new()
.eq("status", "active")
.gte("age", 18)
.build();
let active_adults: Vec<User> = users
.find(filter)
.await?
.try_collect()
.await?;
Ok(())
}
Models are mapped to MongoDB documents using serde:
use serde::{Deserialize, Serialize};
use prax_mongodb::ObjectId;
#[derive(Debug, Serialize, Deserialize)]
struct User {
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
id: Option<ObjectId>,
name: String,
email: String,
#[serde(default)]
tags: Vec<String>,
}
Build type-safe MongoDB queries:
use prax_mongodb::FilterBuilder;
// Simple equality
let filter = FilterBuilder::new()
.eq("status", "active")
.build();
// Comparisons
let filter = FilterBuilder::new()
.gte("age", 18)
.lt("age", 65)
.build();
// Array operations
let filter = FilterBuilder::new()
.in_array("status", vec!["active", "pending"])
.all("tags", vec!["rust", "async"])
.build();
// Text search
let filter = FilterBuilder::new()
.text_search("hello world")
.build();
// Logical operators
let filter = FilterBuilder::new()
.or(vec![
doc! { "priority": "high" },
doc! { "urgent": true },
])
.build();
// Geospatial
let filter = FilterBuilder::new()
.near("location", -73.97, 40.77, Some(1000.0))
.build();
Build aggregation pipelines with helpers:
use prax_mongodb::types::aggregation::*;
let pipeline = vec![
match_stage(doc! { "status": "completed" }),
group_stage(
"$category".into(),
doc! {
"total": sum("$amount"),
"count": sum(1),
"avg": avg("$amount"),
},
),
sort_stage(doc! { "total": -1 }),
limit_stage(10),
];
let results = collection.aggregate(pipeline).await?;
use prax_mongodb::{MongoConfig, ReadPreference, WriteConcern};
use std::time::Duration;
let config = MongoConfig::builder()
.uri("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0")
.database("mydb")
.app_name("my-service")
.max_pool_size(100)
.min_pool_size(10)
.connect_timeout(Duration::from_secs(10))
.read_preference(ReadPreference::SecondaryPreferred)
.write_concern(WriteConcern::Majority)
.retry_writes(true)
.compressors(vec!["zstd".into()])
.build()?;
For MongoDB Atlas, use the connection string from Atlas:
let client = MongoClient::builder()
.uri("mongodb+srv://user:pass@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority")
.database("mydb")
.build()
.await?;
Use sessions for multi-document transactions:
let mut session = client.start_session().await?;
session.start_transaction(None).await?;
// Perform operations within transaction
users.insert_one_with_session(user, &mut session).await?;
orders.insert_one_with_session(order, &mut session).await?;
session.commit_transaction().await?;
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
MongoDB query engine for Prax ORM.
prax-mongodb provides an async MongoDB backend using the official mongodb Rust driver with built-in connection pooling.
use prax_mongodb::{MongoClient, FilterBuilder, doc};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a client
let client = MongoClient::builder()
.uri("mongodb://localhost:27017")
.database("mydb")
.max_pool_size(10)
.build()
.await?;
// Get a typed collection
let users = client.collection::<User>("users");
// Insert a document
users.insert_one(User { name: "Alice".into(), age: 30 }).await?;
// Query with filter builder
let filter = FilterBuilder::new()
.eq("status", "active")
.gte("age", 18)
.build();
let active_adults: Vec<User> = users
.find(filter)
.await?
.try_collect()
.await?;
Ok(())
}
Models are mapped to MongoDB documents using serde:
use serde::{Deserialize, Serialize};
use prax_mongodb::ObjectId;
#[derive(Debug, Serialize, Deserialize)]
struct User {
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
id: Option<ObjectId>,
name: String,
email: String,
#[serde(default)]
tags: Vec<String>,
}
Build type-safe MongoDB queries:
use prax_mongodb::FilterBuilder;
// Simple equality
let filter = FilterBuilder::new()
.eq("status", "active")
.build();
// Comparisons
let filter = FilterBuilder::new()
.gte("age", 18)
.lt("age", 65)
.build();
// Array operations
let filter = FilterBuilder::new()
.in_array("status", vec!["active", "pending"])
.all("tags", vec!["rust", "async"])
.build();
// Text search
let filter = FilterBuilder::new()
.text_search("hello world")
.build();
// Logical operators
let filter = FilterBuilder::new()
.or(vec![
doc! { "priority": "high" },
doc! { "urgent": true },
])
.build();
// Geospatial
let filter = FilterBuilder::new()
.near("location", -73.97, 40.77, Some(1000.0))
.build();
Build aggregation pipelines with helpers:
use prax_mongodb::types::aggregation::*;
let pipeline = vec![
match_stage(doc! { "status": "completed" }),
group_stage(
"$category".into(),
doc! {
"total": sum("$amount"),
"count": sum(1),
"avg": avg("$amount"),
},
),
sort_stage(doc! { "total": -1 }),
limit_stage(10),
];
let results = collection.aggregate(pipeline).await?;
use prax_mongodb::{MongoConfig, ReadPreference, WriteConcern};
use std::time::Duration;
let config = MongoConfig::builder()
.uri("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0")
.database("mydb")
.app_name("my-service")
.max_pool_size(100)
.min_pool_size(10)
.connect_timeout(Duration::from_secs(10))
.read_preference(ReadPreference::SecondaryPreferred)
.write_concern(WriteConcern::Majority)
.retry_writes(true)
.compressors(vec!["zstd".into()])
.build()?;
For MongoDB Atlas, use the connection string from Atlas:
let client = MongoClient::builder()
.uri("mongodb+srv://user:pass@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority")
.database("mydb")
.build()
.await?;
Use sessions for multi-document transactions:
let mut session = client.start_session().await?;
session.start_transaction(None).await?;
// Perform operations within transaction
users.insert_one_with_session(user, &mut session).await?;
orders.insert_one_with_session(order, &mut session).await?;
session.commit_transaction().await?;
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
MongoDB query engine for Prax ORM.
prax-mongodb provides an async MongoDB backend using the official mongodb Rust driver with built-in connection pooling.
use prax_mongodb::{MongoClient, FilterBuilder, doc};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a client
let client = MongoClient::builder()
.uri("mongodb://localhost:27017")
.database("mydb")
.max_pool_size(10)
.build()
.await?;
// Get a typed collection
let users = client.collection::<User>("users");
// Insert a document
users.insert_one(User { name: "Alice".into(), age: 30 }).await?;
// Query with filter builder
let filter = FilterBuilder::new()
.eq("status", "active")
.gte("age", 18)
.build();
let active_adults: Vec<User> = users
.find(filter)
.await?
.try_collect()
.await?;
Ok(())
}
Models are mapped to MongoDB documents using serde:
use serde::{Deserialize, Serialize};
use prax_mongodb::ObjectId;
#[derive(Debug, Serialize, Deserialize)]
struct User {
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
id: Option<ObjectId>,
name: String,
email: String,
#[serde(default)]
tags: Vec<String>,
}
Build type-safe MongoDB queries:
use prax_mongodb::FilterBuilder;
// Simple equality
let filter = FilterBuilder::new()
.eq("status", "active")
.build();
// Comparisons
let filter = FilterBuilder::new()
.gte("age", 18)
.lt("age", 65)
.build();
// Array operations
let filter = FilterBuilder::new()
.in_array("status", vec!["active", "pending"])
.all("tags", vec!["rust", "async"])
.build();
// Text search
let filter = FilterBuilder::new()
.text_search("hello world")
.build();
// Logical operators
let filter = FilterBuilder::new()
.or(vec![
doc! { "priority": "high" },
doc! { "urgent": true },
])
.build();
// Geospatial
let filter = FilterBuilder::new()
.near("location", -73.97, 40.77, Some(1000.0))
.build();
Build aggregation pipelines with helpers:
use prax_mongodb::types::aggregation::*;
let pipeline = vec![
match_stage(doc! { "status": "completed" }),
group_stage(
"$category".into(),
doc! {
"total": sum("$amount"),
"count": sum(1),
"avg": avg("$amount"),
},
),
sort_stage(doc! { "total": -1 }),
limit_stage(10),
];
let results = collection.aggregate(pipeline).await?;
use prax_mongodb::{MongoConfig, ReadPreference, WriteConcern};
use std::time::Duration;
let config = MongoConfig::builder()
.uri("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0")
.database("mydb")
.app_name("my-service")
.max_pool_size(100)
.min_pool_size(10)
.connect_timeout(Duration::from_secs(10))
.read_preference(ReadPreference::SecondaryPreferred)
.write_concern(WriteConcern::Majority)
.retry_writes(true)
.compressors(vec!["zstd".into()])
.build()?;
For MongoDB Atlas, use the connection string from Atlas:
let client = MongoClient::builder()
.uri("mongodb+srv://user:pass@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority")
.database("mydb")
.build()
.await?;
Use sessions for multi-document transactions:
let mut session = client.start_session().await?;
session.start_transaction(None).await?;
// Perform operations within transaction
users.insert_one_with_session(user, &mut session).await?;
orders.insert_one_with_session(order, &mut session).await?;
session.commit_transaction().await?;
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
MongoDB query engine for Prax ORM.
prax-mongodb provides an async MongoDB backend using the official mongodb Rust driver with built-in connection pooling.
use prax_mongodb::{MongoClient, FilterBuilder, doc};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a client
let client = MongoClient::builder()
.uri("mongodb://localhost:27017")
.database("mydb")
.max_pool_size(10)
.build()
.await?;
// Get a typed collection
let users = client.collection::<User>("users");
// Insert a document
users.insert_one(User { name: "Alice".into(), age: 30 }).await?;
// Query with filter builder
let filter = FilterBuilder::new()
.eq("status", "active")
.gte("age", 18)
.build();
let active_adults: Vec<User> = users
.find(filter)
.await?
.try_collect()
.await?;
Ok(())
}
Models are mapped to MongoDB documents using serde:
use serde::{Deserialize, Serialize};
use prax_mongodb::ObjectId;
#[derive(Debug, Serialize, Deserialize)]
struct User {
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
id: Option<ObjectId>,
name: String,
email: String,
#[serde(default)]
tags: Vec<String>,
}
Build type-safe MongoDB queries:
use prax_mongodb::FilterBuilder;
// Simple equality
let filter = FilterBuilder::new()
.eq("status", "active")
.build();
// Comparisons
let filter = FilterBuilder::new()
.gte("age", 18)
.lt("age", 65)
.build();
// Array operations
let filter = FilterBuilder::new()
.in_array("status", vec!["active", "pending"])
.all("tags", vec!["rust", "async"])
.build();
// Text search
let filter = FilterBuilder::new()
.text_search("hello world")
.build();
// Logical operators
let filter = FilterBuilder::new()
.or(vec![
doc! { "priority": "high" },
doc! { "urgent": true },
])
.build();
// Geospatial
let filter = FilterBuilder::new()
.near("location", -73.97, 40.77, Some(1000.0))
.build();
Build aggregation pipelines with helpers:
use prax_mongodb::types::aggregation::*;
let pipeline = vec![
match_stage(doc! { "status": "completed" }),
group_stage(
"$category".into(),
doc! {
"total": sum("$amount"),
"count": sum(1),
"avg": avg("$amount"),
},
),
sort_stage(doc! { "total": -1 }),
limit_stage(10),
];
let results = collection.aggregate(pipeline).await?;
use prax_mongodb::{MongoConfig, ReadPreference, WriteConcern};
use std::time::Duration;
let config = MongoConfig::builder()
.uri("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0")
.database("mydb")
.app_name("my-service")
.max_pool_size(100)
.min_pool_size(10)
.connect_timeout(Duration::from_secs(10))
.read_preference(ReadPreference::SecondaryPreferred)
.write_concern(WriteConcern::Majority)
.retry_writes(true)
.compressors(vec!["zstd".into()])
.build()?;
For MongoDB Atlas, use the connection string from Atlas:
let client = MongoClient::builder()
.uri("mongodb+srv://user:pass@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority")
.database("mydb")
.build()
.await?;
Use sessions for multi-document transactions:
let mut session = client.start_session().await?;
session.start_transaction(None).await?;
// Perform operations within transaction
users.insert_one_with_session(user, &mut session).await?;
orders.insert_one_with_session(order, &mut session).await?;
session.commit_transaction().await?;
Licensed under either of Apache License, Version 2.0 or MIT license at your option.