# gdmongolite - The World's Most Powerful and Easiest MongoDB Toolkit
**Zero-boilerplate, schema-first MongoDB operations with automatic sync/async detection, advanced queries, real-time features, comprehensive security, intelligent caching, full monitoring, FastAPI integration, and production-ready deployment tools.**
[](https://badge.fury.io/py/gdmongolite)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
## Installation
```bash
pip install gdmongolite
```
## Quick Start (30 seconds to productivity!)
```python
from gdmongolite import DB, Schema, Email, FieldTypes
# 1. Define your data model
class User(Schema):
name: FieldTypes.Name
email: Email
age: FieldTypes.Age
role: str = "user"
# 2. Connect and register
db = DB() # Auto-connects to MongoDB
db.register_schema(User)
# 3. Use it! (Works in both sync and async)
async def main():
# Insert with automatic validation
user = await db.User.insert({
"name": "John Doe",
"email": "john@example.com",
"age": 30
})
# Query with advanced filtering
users = await db.User.find(age__gte=18, role="user").to_list()
# Update documents
await db.User.update({"role": "user"}, {"$set": {"role": "member"}})
# Aggregations made simple
stats = await db.User.aggregate().group("$role", count={"$sum": 1}).execute()
```
## Complete Feature Guide
### 1. Schema Definition and Validation
```python
from gdmongolite import DB, Schema, Email, FieldTypes
from typing import List, Optional
from datetime import datetime
class User(Schema):
# Built-in field types with validation
name: FieldTypes.Name # 1-100 chars
email: Email # Email validation
age: FieldTypes.Age # 0-150 range
username: FieldTypes.Username # 3-30 chars, alphanumeric
# Optional fields with defaults
role: str = "user"
is_active: bool = True
tags: List[str] = []
created_at: datetime = datetime.now()
# Custom validation
bio: Optional[FieldTypes.Description] = None # Max 1000 chars
class Product(Schema):
name: FieldTypes.Title
price: FieldTypes.Price # Non-negative float
rating: FieldTypes.Rating # 0-5 range
category: str
in_stock: bool = True
class Order(Schema):
user_id: str
product_ids: List[str]
total: FieldTypes.Price
status: str = "pending"
order_date: datetime = datetime.now()
```
### 2. Database Connection and Setup
```python
# Basic connection (uses environment variables or defaults)
db = DB()
# Custom connection
db = DB(
uri="mongodb://localhost:27017",
database="myapp"
)
# Production connection with all options
db = DB(
uri="mongodb+srv://user:pass@cluster.mongodb.net/",
database="production"
)
# Register your schemas
db.register_schema(User)
db.register_schema(Product)
db.register_schema(Order)
```
### 3. CRUD Operations (Create, Read, Update, Delete)
#### Create (Insert)
```python
# Single document
user = await db.User.insert({
"name": "Alice Johnson",
"email": "alice@example.com",
"age": 28,
"role": "admin"
})
# Multiple documents
users = await db.User.insert([
{"name": "Bob", "email": "bob@example.com", "age": 25},
{"name": "Carol", "email": "carol@example.com", "age": 30}
])
# Using schema objects
user_obj = User(name="David", email="david@example.com", age=35)
result = await db.User.insert(user_obj)
```
#### Read (Find/Query)
```python
# Find all
all_users = await db.User.find().to_list()
# Find with filters
adults = await db.User.find(age__gte=18).to_list()
admins = await db.User.find(role="admin").to_list()
# Complex queries
active_adults = await db.User.find(
age__gte=18,
is_active=True,
role__in=["user", "admin"]
).to_list()
# Find one
user = await db.User.find(email="alice@example.com").first()
# Pagination
page1 = await db.User.find().skip(0).limit(10).to_list()
page2 = await db.User.find().skip(10).limit(10).to_list()
# Sorting
newest = await db.User.find().sort("-created_at").to_list()
oldest = await db.User.find().sort("created_at").to_list()
# Count
total_users = await db.User.find().count()
adult_count = await db.User.find(age__gte=18).count()
```
#### Update
```python
# Update many documents
result = await db.User.update(
{"role": "user"}, # Filter
{"$set": {"role": "member"}} # Update
)
# Update with operators
await db.User.update(
{"_id": user_id},
{
"$set": {"last_login": datetime.now()},
"$inc": {"login_count": 1},
"$push": {"tags": "active"}
}
)
# Upsert (insert if not exists)
await db.User.update(
{"email": "new@example.com"},
{"$set": {"name": "New User", "age": 25}},
upsert=True
)
```
#### Delete
```python
# Delete documents
result = await db.User.delete(role="inactive")
result = await db.User.delete(age__lt=13) # Remove underage users
# Delete by ID
await db.User.delete(_id=user_id)
```
### 4. Advanced Queries and Aggregations
```python
# Complex aggregation pipeline
pipeline_result = await (
db.Order.aggregate()
.match(status="completed")
.lookup("users", "user_id", "_id", "user_info")
.unwind("user_info")
.group(
"$user_info.role",
total_orders={"$sum": 1},
total_revenue={"$sum": "$total"},
avg_order={"$avg": "$total"}
)
.sort(total_revenue=-1)
.execute()
)
# Statistical analysis
user_stats = await (
db.User.aggregate()
.group(
None,
total_users={"$sum": 1},
avg_age={"$avg": "$age"},
min_age={"$min": "$age"},
max_age={"$max": "$age"}
)
.execute()
)
# Date-based grouping
monthly_signups = await (
db.User.aggregate()
.group(
{"$dateToString": {"format": "%Y-%m", "date": "$created_at"}},
count={"$sum": 1}
)
.sort(_id=1)
.execute()
)
```
### 5. Data Import/Export
```python
from gdmongolite import DataImporter, DataExporter
# Export data
exporter = DataExporter(db)
# Export to JSON
await exporter.export_to_json(db.User, "users.json")
await exporter.export_to_json(
db.User.find(role="admin"),
"admin_users.json"
)
# Export to CSV
await exporter.export_to_csv(db.User, "users.csv")
# Import data
importer = DataImporter(db)
# Import from JSON
await importer.import_from_json("users.json", User)
# Import from CSV with mapping
await importer.import_from_csv(
"users.csv",
User,
field_mapping={
"full_name": "name",
"email_address": "email",
"user_age": "age"
}
)
# Batch import with validation
await importer.batch_import(
data_source="large_dataset.json",
schema=User,
batch_size=1000,
validate=True
)
```
### 6. FastAPI Integration (Auto-Generated REST APIs)
```python
from gdmongolite import create_fastapi_app
from fastapi import FastAPI
# Create full REST API automatically
app = create_fastapi_app(
db,
schemas=[User, Product, Order],
title="My Powerful API",
version="1.0.0",
enable_docs=True
)
# Automatically generates these endpoints:
# GET /users/ - List users (with pagination, filtering, sorting)
# POST /users/ - Create user
# GET /users/{id} - Get user by ID
# PUT /users/{id} - Update user
# DELETE /users/{id} - Delete user
# POST /users/search - Advanced search
# GET /users/count - Count users
# Same for Product and Order...
# Add custom endpoints
@app.get("/analytics/dashboard")
async def analytics():
return {
"total_users": await db.User.find().count(),
"total_orders": await db.Order.find().count(),
"revenue": await db.Order.aggregate().group(
None, total={"$sum": "$total"}
).execute()
}
# Run the server
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
```
### 7. Real-time Features and WebSockets
```python
from gdmongolite import WebSocketManager
from fastapi import WebSocket
# Real-time data updates
@app.websocket("/ws/users")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
# Watch for changes in User collection
async def on_user_change(change):
await websocket.send_json({
"type": "user_update",
"operation": change["operationType"],
"data": change.get("fullDocument", {})
})
# Subscribe to changes
await db.User.watch_changes(on_user_change)
# Live queries that update automatically
live_query = db.User.live_query(is_active=True)
await live_query.subscribe(websocket)
```
### 8. Security and Authentication
```python
from gdmongolite import SecurityMiddleware, PasswordManager
# Setup security
security = SecurityMiddleware(db)
# Password hashing
password_manager = PasswordManager()
hashed = password_manager.hash_password("user_password")
is_valid = password_manager.verify_password("user_password", hashed)
# JWT tokens
from gdmongolite import JWTManager
jwt_manager = JWTManager(secret_key="your-secret-key")
@app.post("/login")
async def login(email: str, password: str):
user = await db.User.find(email=email).first()
if user and password_manager.verify_password(password, user["password"]):
token = jwt_manager.create_token({"user_id": str(user["_id"])})
return {"access_token": token}
raise HTTPException(401, "Invalid credentials")
# Protected endpoints
@app.get("/protected")
async def protected_route(current_user=Depends(jwt_manager.get_current_user)):
return {"message": f"Hello {current_user['email']}"}
```
### 9. Caching for Performance
```python
from gdmongolite import add_caching_to_db
# Enable caching
cached_db = add_caching_to_db(db)
# Cached queries (automatic)
users = await cached_db.User.find(role="admin").to_list() # Cached
users = await cached_db.User.find(role="admin").to_list() # From cache
# Manual caching
@cached_db.cached(ttl=300) # Cache for 5 minutes
async def expensive_operation():
return await db.Order.aggregate().complex_pipeline().execute()
# Cache statistics
cache_stats = cached_db.get_cache_stats()
print(f"Hit rate: {cache_stats['hit_rate']}")
```
### 10. Monitoring and Performance
```python
from gdmongolite import add_monitoring_to_db
# Enable monitoring
monitored_db = add_monitoring_to_db(db)
# Get performance metrics
stats = monitored_db.get_performance_stats()
print(f"Average query time: {stats['avg_query_time']}ms")
print(f"Slow queries: {len(stats['slow_queries'])}")
# Health check
health = monitored_db.health_check()
print(f"Database status: {health['status']}")
print(f"Connection pool: {health['connection_pool']}")
# Built-in monitoring dashboard
@app.get("/monitoring/dashboard")
async def monitoring_dashboard():
return monitored_db.get_full_stats()
```
### 11. Sync Usage (Non-async)
```python
# All operations work in sync mode too
db = DB()
db.register_schema(User)
# Sync operations (automatically detected)
user = db.User.insert_sync({
"name": "Sync User",
"email": "sync@example.com",
"age": 25
})
users = db.User.find(age__gte=18).to_list_sync()
db.User.update_sync({"role": "user"}, {"$set": {"updated": True}})
```
### 12. Environment Configuration
```python
# .env file
MONGO_URI=mongodb://localhost:27017
MONGO_DB=myapp
MONGO_MAX_POOL=50
MONGO_MIN_POOL=5
MONGO_TIMEOUT_MS=30000
# Advanced configuration
GDMONGO_CACHE_TTL=3600
GDMONGO_ENABLE_MONITORING=true
GDMONGO_LOG_SLOW_QUERIES=true
GDMONGO_SLOW_QUERY_THRESHOLD=500
```
### 13. Production Deployment
```python
# Production-ready setup
from gdmongolite import production_setup
db = production_setup(
uri="mongodb+srv://user:pass@cluster.mongodb.net/",
database="production"
)
# With all features enabled
app = create_fastapi_app(
db,
schemas=[User, Product, Order],
enable_monitoring=True,
enable_caching=True,
enable_security=True,
cors_origins=["https://myapp.com"]
)
# Docker deployment
# FROM python:3.11-slim
# COPY . /app
# WORKDIR /app
# RUN pip install gdmongolite
# CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```
## Why Choose gdmongolite?
### vs PyMongo
- ❌ PyMongo: Manual everything, no validation, verbose syntax
- ✅ gdmongolite: Automatic validation, simple syntax, zero boilerplate
### vs MongoEngine
- ❌ MongoEngine: Django-style (heavy), sync-only, limited features
- ✅ gdmongolite: Lightweight, sync+async, comprehensive features
### vs Motor
- ❌ Motor: Async-only, no validation, manual serialization
- ✅ gdmongolite: Universal, automatic validation, smart serialization
### vs Beanie
- ❌ Beanie: Async-only, complex setup, limited tooling
- ✅ gdmongolite: Universal, zero setup, rich tooling
## Complete Example: E-commerce API
```python
from gdmongolite import DB, Schema, Email, FieldTypes, create_fastapi_app
from datetime import datetime
from typing import List
# Define schemas
class User(Schema):
name: FieldTypes.Name
email: Email
password_hash: str
role: str = "customer"
class Product(Schema):
name: FieldTypes.Title
price: FieldTypes.Price
category: str
stock: int = 0
class Order(Schema):
user_id: str
items: List[dict]
total: FieldTypes.Price
status: str = "pending"
created_at: datetime = datetime.now()
# Setup database
db = DB()
for schema in [User, Product, Order]:
db.register_schema(schema)
# Create API
app = create_fastapi_app(db, [User, Product, Order])
# Custom business logic
@app.post("/orders/")
async def create_order(order_data: dict):
# Validate stock
for item in order_data["items"]:
product = await db.Product.find(_id=item["product_id"]).first()
if product["stock"] < item["quantity"]:
raise HTTPException(400, "Insufficient stock")
# Create order
order = await db.Order.insert(order_data)
# Update stock
for item in order_data["items"]:
await db.Product.update(
{"_id": item["product_id"]},
{"$inc": {"stock": -item["quantity"]}}
)
return order
@app.get("/analytics")
async def analytics():
return {
"total_users": await db.User.find().count(),
"total_orders": await db.Order.find().count(),
"revenue": await db.Order.aggregate().group(
None, total={"$sum": "$total"}
).execute(),
"top_products": await db.Product.find().sort("-rating").limit(5).to_list()
}
# Run: uvicorn main:app --reload
```
## Support and Documentation
- **GitHub**: https://github.com/ganeshdatta23/gdmongolite
- **Documentation**: https://gdmongolite.readthedocs.io
- **PyPI**: https://pypi.org/project/gdmongolite/
- **Issues**: https://github.com/ganeshdatta23/gdmongolite/issues
## License
MIT License - see [LICENSE](LICENSE) file.
## Author
**Ganesh Datta Padamata**
- Email: ganeshdattapadamata@gmail.com
- GitHub: [@ganeshdatta23](https://github.com/ganeshdatta23)
---
**🚀 Transform your MongoDB development experience with gdmongolite!**
Raw data
{
"_id": null,
"home_page": null,
"name": "gdmongolite",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": null,
"keywords": "mongodb, database, orm, async, pydantic, fastapi, websockets, caching, security, monitoring, migrations, real-time, analytics, aggregation, joins, cli, production, microservices, api",
"author": "Ganesh Datta Padamata",
"author_email": "ganeshdattapadamata@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/9e/e4/c0dad5142ca697cd9274d62deb174ddb70d332ea935d24028403215f73be/gdmongolite-1.0.3.tar.gz",
"platform": null,
"description": "# gdmongolite - The World's Most Powerful and Easiest MongoDB Toolkit\n\n**Zero-boilerplate, schema-first MongoDB operations with automatic sync/async detection, advanced queries, real-time features, comprehensive security, intelligent caching, full monitoring, FastAPI integration, and production-ready deployment tools.**\n\n[](https://badge.fury.io/py/gdmongolite)\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n\n## Installation\n\n```bash\npip install gdmongolite\n```\n\n## Quick Start (30 seconds to productivity!)\n\n```python\nfrom gdmongolite import DB, Schema, Email, FieldTypes\n\n# 1. Define your data model\nclass User(Schema):\n name: FieldTypes.Name\n email: Email\n age: FieldTypes.Age\n role: str = \"user\"\n\n# 2. Connect and register\ndb = DB() # Auto-connects to MongoDB\ndb.register_schema(User)\n\n# 3. Use it! (Works in both sync and async)\nasync def main():\n # Insert with automatic validation\n user = await db.User.insert({\n \"name\": \"John Doe\",\n \"email\": \"john@example.com\",\n \"age\": 30\n })\n \n # Query with advanced filtering\n users = await db.User.find(age__gte=18, role=\"user\").to_list()\n \n # Update documents\n await db.User.update({\"role\": \"user\"}, {\"$set\": {\"role\": \"member\"}})\n \n # Aggregations made simple\n stats = await db.User.aggregate().group(\"$role\", count={\"$sum\": 1}).execute()\n```\n\n## Complete Feature Guide\n\n### 1. Schema Definition and Validation\n\n```python\nfrom gdmongolite import DB, Schema, Email, FieldTypes\nfrom typing import List, Optional\nfrom datetime import datetime\n\nclass User(Schema):\n # Built-in field types with validation\n name: FieldTypes.Name # 1-100 chars\n email: Email # Email validation\n age: FieldTypes.Age # 0-150 range\n username: FieldTypes.Username # 3-30 chars, alphanumeric\n \n # Optional fields with defaults\n role: str = \"user\"\n is_active: bool = True\n tags: List[str] = []\n created_at: datetime = datetime.now()\n \n # Custom validation\n bio: Optional[FieldTypes.Description] = None # Max 1000 chars\n\nclass Product(Schema):\n name: FieldTypes.Title\n price: FieldTypes.Price # Non-negative float\n rating: FieldTypes.Rating # 0-5 range\n category: str\n in_stock: bool = True\n\nclass Order(Schema):\n user_id: str\n product_ids: List[str]\n total: FieldTypes.Price\n status: str = \"pending\"\n order_date: datetime = datetime.now()\n```\n\n### 2. Database Connection and Setup\n\n```python\n# Basic connection (uses environment variables or defaults)\ndb = DB()\n\n# Custom connection\ndb = DB(\n uri=\"mongodb://localhost:27017\",\n database=\"myapp\"\n)\n\n# Production connection with all options\ndb = DB(\n uri=\"mongodb+srv://user:pass@cluster.mongodb.net/\",\n database=\"production\"\n)\n\n# Register your schemas\ndb.register_schema(User)\ndb.register_schema(Product)\ndb.register_schema(Order)\n```\n\n### 3. CRUD Operations (Create, Read, Update, Delete)\n\n#### Create (Insert)\n```python\n# Single document\nuser = await db.User.insert({\n \"name\": \"Alice Johnson\",\n \"email\": \"alice@example.com\",\n \"age\": 28,\n \"role\": \"admin\"\n})\n\n# Multiple documents\nusers = await db.User.insert([\n {\"name\": \"Bob\", \"email\": \"bob@example.com\", \"age\": 25},\n {\"name\": \"Carol\", \"email\": \"carol@example.com\", \"age\": 30}\n])\n\n# Using schema objects\nuser_obj = User(name=\"David\", email=\"david@example.com\", age=35)\nresult = await db.User.insert(user_obj)\n```\n\n#### Read (Find/Query)\n```python\n# Find all\nall_users = await db.User.find().to_list()\n\n# Find with filters\nadults = await db.User.find(age__gte=18).to_list()\nadmins = await db.User.find(role=\"admin\").to_list()\n\n# Complex queries\nactive_adults = await db.User.find(\n age__gte=18,\n is_active=True,\n role__in=[\"user\", \"admin\"]\n).to_list()\n\n# Find one\nuser = await db.User.find(email=\"alice@example.com\").first()\n\n# Pagination\npage1 = await db.User.find().skip(0).limit(10).to_list()\npage2 = await db.User.find().skip(10).limit(10).to_list()\n\n# Sorting\nnewest = await db.User.find().sort(\"-created_at\").to_list()\noldest = await db.User.find().sort(\"created_at\").to_list()\n\n# Count\ntotal_users = await db.User.find().count()\nadult_count = await db.User.find(age__gte=18).count()\n```\n\n#### Update\n```python\n# Update many documents\nresult = await db.User.update(\n {\"role\": \"user\"}, # Filter\n {\"$set\": {\"role\": \"member\"}} # Update\n)\n\n# Update with operators\nawait db.User.update(\n {\"_id\": user_id},\n {\n \"$set\": {\"last_login\": datetime.now()},\n \"$inc\": {\"login_count\": 1},\n \"$push\": {\"tags\": \"active\"}\n }\n)\n\n# Upsert (insert if not exists)\nawait db.User.update(\n {\"email\": \"new@example.com\"},\n {\"$set\": {\"name\": \"New User\", \"age\": 25}},\n upsert=True\n)\n```\n\n#### Delete\n```python\n# Delete documents\nresult = await db.User.delete(role=\"inactive\")\nresult = await db.User.delete(age__lt=13) # Remove underage users\n\n# Delete by ID\nawait db.User.delete(_id=user_id)\n```\n\n### 4. Advanced Queries and Aggregations\n\n```python\n# Complex aggregation pipeline\npipeline_result = await (\n db.Order.aggregate()\n .match(status=\"completed\")\n .lookup(\"users\", \"user_id\", \"_id\", \"user_info\")\n .unwind(\"user_info\")\n .group(\n \"$user_info.role\",\n total_orders={\"$sum\": 1},\n total_revenue={\"$sum\": \"$total\"},\n avg_order={\"$avg\": \"$total\"}\n )\n .sort(total_revenue=-1)\n .execute()\n)\n\n# Statistical analysis\nuser_stats = await (\n db.User.aggregate()\n .group(\n None,\n total_users={\"$sum\": 1},\n avg_age={\"$avg\": \"$age\"},\n min_age={\"$min\": \"$age\"},\n max_age={\"$max\": \"$age\"}\n )\n .execute()\n)\n\n# Date-based grouping\nmonthly_signups = await (\n db.User.aggregate()\n .group(\n {\"$dateToString\": {\"format\": \"%Y-%m\", \"date\": \"$created_at\"}},\n count={\"$sum\": 1}\n )\n .sort(_id=1)\n .execute()\n)\n```\n\n### 5. Data Import/Export\n\n```python\nfrom gdmongolite import DataImporter, DataExporter\n\n# Export data\nexporter = DataExporter(db)\n\n# Export to JSON\nawait exporter.export_to_json(db.User, \"users.json\")\nawait exporter.export_to_json(\n db.User.find(role=\"admin\"), \n \"admin_users.json\"\n)\n\n# Export to CSV\nawait exporter.export_to_csv(db.User, \"users.csv\")\n\n# Import data\nimporter = DataImporter(db)\n\n# Import from JSON\nawait importer.import_from_json(\"users.json\", User)\n\n# Import from CSV with mapping\nawait importer.import_from_csv(\n \"users.csv\", \n User,\n field_mapping={\n \"full_name\": \"name\",\n \"email_address\": \"email\",\n \"user_age\": \"age\"\n }\n)\n\n# Batch import with validation\nawait importer.batch_import(\n data_source=\"large_dataset.json\",\n schema=User,\n batch_size=1000,\n validate=True\n)\n```\n\n### 6. FastAPI Integration (Auto-Generated REST APIs)\n\n```python\nfrom gdmongolite import create_fastapi_app\nfrom fastapi import FastAPI\n\n# Create full REST API automatically\napp = create_fastapi_app(\n db,\n schemas=[User, Product, Order],\n title=\"My Powerful API\",\n version=\"1.0.0\",\n enable_docs=True\n)\n\n# Automatically generates these endpoints:\n# GET /users/ - List users (with pagination, filtering, sorting)\n# POST /users/ - Create user\n# GET /users/{id} - Get user by ID\n# PUT /users/{id} - Update user\n# DELETE /users/{id} - Delete user\n# POST /users/search - Advanced search\n# GET /users/count - Count users\n# Same for Product and Order...\n\n# Add custom endpoints\n@app.get(\"/analytics/dashboard\")\nasync def analytics():\n return {\n \"total_users\": await db.User.find().count(),\n \"total_orders\": await db.Order.find().count(),\n \"revenue\": await db.Order.aggregate().group(\n None, total={\"$sum\": \"$total\"}\n ).execute()\n }\n\n# Run the server\nif __name__ == \"__main__\":\n import uvicorn\n uvicorn.run(app, host=\"0.0.0.0\", port=8000)\n```\n\n### 7. Real-time Features and WebSockets\n\n```python\nfrom gdmongolite import WebSocketManager\nfrom fastapi import WebSocket\n\n# Real-time data updates\n@app.websocket(\"/ws/users\")\nasync def websocket_endpoint(websocket: WebSocket):\n await websocket.accept()\n \n # Watch for changes in User collection\n async def on_user_change(change):\n await websocket.send_json({\n \"type\": \"user_update\",\n \"operation\": change[\"operationType\"],\n \"data\": change.get(\"fullDocument\", {})\n })\n \n # Subscribe to changes\n await db.User.watch_changes(on_user_change)\n\n# Live queries that update automatically\nlive_query = db.User.live_query(is_active=True)\nawait live_query.subscribe(websocket)\n```\n\n### 8. Security and Authentication\n\n```python\nfrom gdmongolite import SecurityMiddleware, PasswordManager\n\n# Setup security\nsecurity = SecurityMiddleware(db)\n\n# Password hashing\npassword_manager = PasswordManager()\nhashed = password_manager.hash_password(\"user_password\")\nis_valid = password_manager.verify_password(\"user_password\", hashed)\n\n# JWT tokens\nfrom gdmongolite import JWTManager\njwt_manager = JWTManager(secret_key=\"your-secret-key\")\n\n@app.post(\"/login\")\nasync def login(email: str, password: str):\n user = await db.User.find(email=email).first()\n if user and password_manager.verify_password(password, user[\"password\"]):\n token = jwt_manager.create_token({\"user_id\": str(user[\"_id\"])})\n return {\"access_token\": token}\n raise HTTPException(401, \"Invalid credentials\")\n\n# Protected endpoints\n@app.get(\"/protected\")\nasync def protected_route(current_user=Depends(jwt_manager.get_current_user)):\n return {\"message\": f\"Hello {current_user['email']}\"}\n```\n\n### 9. Caching for Performance\n\n```python\nfrom gdmongolite import add_caching_to_db\n\n# Enable caching\ncached_db = add_caching_to_db(db)\n\n# Cached queries (automatic)\nusers = await cached_db.User.find(role=\"admin\").to_list() # Cached\nusers = await cached_db.User.find(role=\"admin\").to_list() # From cache\n\n# Manual caching\n@cached_db.cached(ttl=300) # Cache for 5 minutes\nasync def expensive_operation():\n return await db.Order.aggregate().complex_pipeline().execute()\n\n# Cache statistics\ncache_stats = cached_db.get_cache_stats()\nprint(f\"Hit rate: {cache_stats['hit_rate']}\")\n```\n\n### 10. Monitoring and Performance\n\n```python\nfrom gdmongolite import add_monitoring_to_db\n\n# Enable monitoring\nmonitored_db = add_monitoring_to_db(db)\n\n# Get performance metrics\nstats = monitored_db.get_performance_stats()\nprint(f\"Average query time: {stats['avg_query_time']}ms\")\nprint(f\"Slow queries: {len(stats['slow_queries'])}\")\n\n# Health check\nhealth = monitored_db.health_check()\nprint(f\"Database status: {health['status']}\")\nprint(f\"Connection pool: {health['connection_pool']}\")\n\n# Built-in monitoring dashboard\n@app.get(\"/monitoring/dashboard\")\nasync def monitoring_dashboard():\n return monitored_db.get_full_stats()\n```\n\n### 11. Sync Usage (Non-async)\n\n```python\n# All operations work in sync mode too\ndb = DB()\ndb.register_schema(User)\n\n# Sync operations (automatically detected)\nuser = db.User.insert_sync({\n \"name\": \"Sync User\",\n \"email\": \"sync@example.com\",\n \"age\": 25\n})\n\nusers = db.User.find(age__gte=18).to_list_sync()\ndb.User.update_sync({\"role\": \"user\"}, {\"$set\": {\"updated\": True}})\n```\n\n### 12. Environment Configuration\n\n```python\n# .env file\nMONGO_URI=mongodb://localhost:27017\nMONGO_DB=myapp\nMONGO_MAX_POOL=50\nMONGO_MIN_POOL=5\nMONGO_TIMEOUT_MS=30000\n\n# Advanced configuration\nGDMONGO_CACHE_TTL=3600\nGDMONGO_ENABLE_MONITORING=true\nGDMONGO_LOG_SLOW_QUERIES=true\nGDMONGO_SLOW_QUERY_THRESHOLD=500\n```\n\n### 13. Production Deployment\n\n```python\n# Production-ready setup\nfrom gdmongolite import production_setup\n\ndb = production_setup(\n uri=\"mongodb+srv://user:pass@cluster.mongodb.net/\",\n database=\"production\"\n)\n\n# With all features enabled\napp = create_fastapi_app(\n db,\n schemas=[User, Product, Order],\n enable_monitoring=True,\n enable_caching=True,\n enable_security=True,\n cors_origins=[\"https://myapp.com\"]\n)\n\n# Docker deployment\n# FROM python:3.11-slim\n# COPY . /app\n# WORKDIR /app\n# RUN pip install gdmongolite\n# CMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]\n```\n\n## Why Choose gdmongolite?\n\n### vs PyMongo\n- \u274c PyMongo: Manual everything, no validation, verbose syntax\n- \u2705 gdmongolite: Automatic validation, simple syntax, zero boilerplate\n\n### vs MongoEngine \n- \u274c MongoEngine: Django-style (heavy), sync-only, limited features\n- \u2705 gdmongolite: Lightweight, sync+async, comprehensive features\n\n### vs Motor\n- \u274c Motor: Async-only, no validation, manual serialization\n- \u2705 gdmongolite: Universal, automatic validation, smart serialization\n\n### vs Beanie\n- \u274c Beanie: Async-only, complex setup, limited tooling\n- \u2705 gdmongolite: Universal, zero setup, rich tooling\n\n## Complete Example: E-commerce API\n\n```python\nfrom gdmongolite import DB, Schema, Email, FieldTypes, create_fastapi_app\nfrom datetime import datetime\nfrom typing import List\n\n# Define schemas\nclass User(Schema):\n name: FieldTypes.Name\n email: Email\n password_hash: str\n role: str = \"customer\"\n\nclass Product(Schema):\n name: FieldTypes.Title\n price: FieldTypes.Price\n category: str\n stock: int = 0\n\nclass Order(Schema):\n user_id: str\n items: List[dict]\n total: FieldTypes.Price\n status: str = \"pending\"\n created_at: datetime = datetime.now()\n\n# Setup database\ndb = DB()\nfor schema in [User, Product, Order]:\n db.register_schema(schema)\n\n# Create API\napp = create_fastapi_app(db, [User, Product, Order])\n\n# Custom business logic\n@app.post(\"/orders/\")\nasync def create_order(order_data: dict):\n # Validate stock\n for item in order_data[\"items\"]:\n product = await db.Product.find(_id=item[\"product_id\"]).first()\n if product[\"stock\"] < item[\"quantity\"]:\n raise HTTPException(400, \"Insufficient stock\")\n \n # Create order\n order = await db.Order.insert(order_data)\n \n # Update stock\n for item in order_data[\"items\"]:\n await db.Product.update(\n {\"_id\": item[\"product_id\"]},\n {\"$inc\": {\"stock\": -item[\"quantity\"]}}\n )\n \n return order\n\n@app.get(\"/analytics\")\nasync def analytics():\n return {\n \"total_users\": await db.User.find().count(),\n \"total_orders\": await db.Order.find().count(),\n \"revenue\": await db.Order.aggregate().group(\n None, total={\"$sum\": \"$total\"}\n ).execute(),\n \"top_products\": await db.Product.find().sort(\"-rating\").limit(5).to_list()\n }\n\n# Run: uvicorn main:app --reload\n```\n\n## Support and Documentation\n\n- **GitHub**: https://github.com/ganeshdatta23/gdmongolite\n- **Documentation**: https://gdmongolite.readthedocs.io\n- **PyPI**: https://pypi.org/project/gdmongolite/\n- **Issues**: https://github.com/ganeshdatta23/gdmongolite/issues\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file.\n\n## Author\n\n**Ganesh Datta Padamata**\n- Email: ganeshdattapadamata@gmail.com\n- GitHub: [@ganeshdatta23](https://github.com/ganeshdatta23)\n\n\n---\n\n**\ud83d\ude80 Transform your MongoDB development experience with gdmongolite!**\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\ud83d\ude80 The World's Most Powerful and Easiest MongoDB Toolkit - Zero-boilerplate, schema-first MongoDB operations with automatic sync/async detection, advanced queries, real-time features, comprehensive security, caching, monitoring, FastAPI integration, and production-ready deployment tools.",
"version": "1.0.3",
"project_urls": {
"Bug Tracker": "https://github.com/ganeshdatta23/gdmongolite/issues",
"Changelog": "https://github.com/ganeshdatta23/gdmongolite/blob/main/CHANGELOG.md",
"Documentation": "https://gdmongolite.readthedocs.io",
"Funding": "https://github.com/sponsors/ganeshdatta23",
"Homepage": "https://github.com/ganeshdatta23/gdmongolite",
"Repository": "https://github.com/ganeshdatta23/gdmongolite"
},
"split_keywords": [
"mongodb",
" database",
" orm",
" async",
" pydantic",
" fastapi",
" websockets",
" caching",
" security",
" monitoring",
" migrations",
" real-time",
" analytics",
" aggregation",
" joins",
" cli",
" production",
" microservices",
" api"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "2bdd0ddbce982980bea60d29d4300f6207bcb56010a78d8adfa23ac69ccf2991",
"md5": "008a3d514b4d1e44309d0fe1fe5c3f69",
"sha256": "936a5d814d2366aad6f2efd61033869b9bd96dda321d862cf06069b8f99032ce"
},
"downloads": -1,
"filename": "gdmongolite-1.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "008a3d514b4d1e44309d0fe1fe5c3f69",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.9",
"size": 60262,
"upload_time": "2025-08-03T21:25:32",
"upload_time_iso_8601": "2025-08-03T21:25:32.479094Z",
"url": "https://files.pythonhosted.org/packages/2b/dd/0ddbce982980bea60d29d4300f6207bcb56010a78d8adfa23ac69ccf2991/gdmongolite-1.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9ee4c0dad5142ca697cd9274d62deb174ddb70d332ea935d24028403215f73be",
"md5": "81495562c878f680d893d7ec77d51709",
"sha256": "be9dfff44bd02e7ca8ff1185f7ad1934e9fb85b76e22eeaed8a3550da35a7561"
},
"downloads": -1,
"filename": "gdmongolite-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "81495562c878f680d893d7ec77d51709",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 56048,
"upload_time": "2025-08-03T21:25:33",
"upload_time_iso_8601": "2025-08-03T21:25:33.926754Z",
"url": "https://files.pythonhosted.org/packages/9e/e4/c0dad5142ca697cd9274d62deb174ddb70d332ea935d24028403215f73be/gdmongolite-1.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-03 21:25:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ganeshdatta23",
"github_project": "gdmongolite",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "click",
"specs": [
[
">=",
"8.1.0"
]
]
},
{
"name": "motor",
"specs": [
[
">=",
"3.3.2"
]
]
},
{
"name": "pymongo",
"specs": [
[
">=",
"4.6.0"
]
]
},
{
"name": "python-dotenv",
"specs": [
[
">=",
"1.0.0"
]
]
},
{
"name": "pydantic",
"specs": [
[
">=",
"2.5.3"
]
]
},
{
"name": "fastapi",
"specs": [
[
">=",
"0.104.0"
]
]
},
{
"name": "uvicorn",
"specs": [
[
">=",
"0.24.0"
]
]
},
{
"name": "pyyaml",
"specs": [
[
">=",
"6.0.1"
]
]
},
{
"name": "aiohttp",
"specs": [
[
">=",
"3.9.0"
]
]
},
{
"name": "aioconsole",
"specs": [
[
">=",
"0.6.1"
]
]
},
{
"name": "rich",
"specs": [
[
">=",
"13.7.0"
]
]
},
{
"name": "bson",
"specs": [
[
">=",
"0.5.10"
]
]
}
],
"lcname": "gdmongolite"
}