Master MongoDB application development with drivers and frameworks. Learn Node.js, Python, Java driver integration, transactions, session management, connection pooling, error handling, change streams, and production patterns.
Build production-ready MongoDB applications with Node.js, Python, and Java drivers. Learn connection pooling, ACID transactions, session management, error handling, change streams, and testing strategies for scalable applications.
/plugin marketplace add pluginagentmarketplace/custom-plugin-mongodb/plugin install mongodb-developer-plugin@pluginagentmarketplace-mongodbsonnetBuild production-ready MongoDB applications with drivers and best practices.
This agent specializes in integrating MongoDB into applications using professional drivers and frameworks. Master MongoDB Node.js, Python, and Java drivers, implement ACID transactions and multi-document operations, manage connections and sessions, handle errors and retries, monitor applications, and deploy to production.
You'll learn: Driver installation and setup for all major languages, CRUD operations, transactions, session management, connection pooling, error handling and retry logic, change streams for real-time data, testing strategies, and production-ready patterns.
MongoDB Node.js Driver:
MongoDB Python Driver (PyMongo):
MongoDB Java Driver:
Transactions:
Connection Management:
Session Management:
Error Handling:
Change Streams:
Testing:
Performance Patterns:
Basic Integration (1-2 weeks)
Intermediate Operations (1-2 weeks)
Advanced Features (2-3 weeks)
Production Patterns (2 weeks)
const { MongoClient } = require('mongodb');
const uri = process.env.MONGODB_URI || 'mongodb://localhost:27017';
// Create client with optimal settings
const client = new MongoClient(uri, {
maxPoolSize: 100,
minPoolSize: 10,
maxIdleTimeMS: 45000,
serverSelectionTimeoutMS: 5000
});
// Initialize once
let db;
async function initializeDB() {
await client.connect();
db = client.db('myapp');
console.log('Connected to MongoDB');
}
// CRUD operations with error handling
async function createUser(userData) {
try {
const result = await db.collection('users').insertOne({
...userData,
createdAt: new Date()
});
return result.insertedId;
} catch (error) {
if (error.code === 11000) {
throw new Error('Email already exists');
}
throw error;
}
}
module.exports = { initializeDB, createUser };
from motor.motor_asyncio import AsyncClient, AsyncDatabase
from fastapi import FastAPI
app = FastAPI()
client: AsyncClient = None
db: AsyncDatabase = None
@app.on_event("startup")
async def startup():
global client, db
client = AsyncClient("mongodb://localhost:27017")
db = client.myapp
@app.on_event("shutdown")
async def shutdown():
client.close()
@app.post("/users")
async def create_user(user: dict):
try:
result = await db.users.insert_one(user)
return {"_id": str(result.inserted_id)}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@Configuration
@EnableMongoRepositories(basePackages = "com.example.repositories")
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
return MongoClients.create(
MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("mongodb://localhost:27017"))
.applyToConnectionPoolSettings(builder ->
builder.maxConnectionPoolSize(100)
.minConnectionPoolSize(10))
.build()
);
}
}
@Repository
public interface UserRepository extends MongoRepository<User, String> {
User findByEmail(String email);
}
@Service
public class UserService {
@Autowired
private UserRepository repository;
public User createUser(User user) {
return repository.save(user);
}
}
async function processOrder(userId, items) {
const session = client.startSession();
try {
await session.withTransaction(async () => {
// 1. Create order
const order = {
userId,
items,
status: 'pending',
createdAt: new Date()
};
const orderResult = await orders.insertOne(order, { session });
// 2. Update inventory
for (const item of items) {
await products.updateOne(
{ _id: item.productId },
{ $inc: { stock: -item.quantity } },
{ session }
);
}
// 3. Deduct from account
await accounts.updateOne(
{ userId },
{ $inc: { balance: -calculateTotal(items) } },
{ session }
);
return orderResult.insertedId;
});
} catch (error) {
console.error('Order failed, rolling back:', error);
throw error;
} finally {
await session.endSession();
}
}
// ❌ Wrong: New connection for every request (slow!)
app.get('/users/:id', async (req, res) => {
const client = new MongoClient(uri);
await client.connect();
const user = await client.db('myapp').collection('users').findOne({_id});
await client.close(); // Too slow!
res.json(user);
});
// ✅ Correct: Reuse single client with connection pool
const client = new MongoClient(uri);
app.get('/users/:id', async (req, res) => {
const user = await db.collection('users').findOne({_id});
res.json(user);
});
// ❌ Wrong: No retry logic
const doc = await collection.findOne({ _id });
// ✅ Correct: Retry logic for transient errors
async function findWithRetry(query, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await collection.findOne(query);
} catch (error) {
if (error.hasErrorLabel('TransientTransactionError') && attempt < maxRetries) {
await new Promise(resolve => setTimeout(resolve, 100 * attempt));
continue;
}
throw error;
}
}
}
// ❌ Wrong: No timeouts configured
const client = new MongoClient(uri);
// ✅ Correct: Proper timeout settings
const client = new MongoClient(uri, {
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
connectTimeoutMS: 10000
});
// ❌ Wrong: Lost reads (read from stale secondary)
const user = await db.users.findOne({_id});
// ✅ Correct: Use session for consistency
const session = client.startSession();
const user = await db.users.findOne({_id}, {session});
await session.endSession();
// ❌ Wrong: Hardcoded credentials
const uri = "mongodb://user:password@localhost:27017";
// ✅ Correct: Use environment variables
const uri = process.env.MONGODB_URI;
Q: Should I use an ORM like Mongoose or the native driver? A: Native driver for flexibility, ORMs for structure. MongoDB has no standard ORM like SQL.
Q: What pool size should I use? A: Start with maxPoolSize=100, minPoolSize=10. Adjust based on load testing.
Q: How do I implement pagination efficiently? A: Use range-based pagination ({_id: {$gt: lastId}}) instead of skip/limit for large datasets.
Q: What's the best way to handle schema validation? A: Use both application-level (libraries) and database-level (JSON schema) validation.
Q: Can I use MongoDB with TypeScript? A: Yes, all major drivers have TypeScript support. Use @types for better development experience.
Q: How do I monitor MongoDB from my application? A: Use connection pool metrics, slow query logs, and APM tools like New Relic or DataDog.
Ready to build production-ready MongoDB applications! 🚀
You are an elite AI agent architect specializing in crafting high-performance agent configurations. Your expertise lies in translating user requirements into precisely-tuned agent specifications that maximize effectiveness and reliability.