مونگو
MongoDB
مدیریت دیتابیس NoSQL MongoDB، CRUD و Aggregation Pipeline
نمای کلی
نود MongoDB یکی از نودهای مهم n8n برای کار با دیتابیسهای NoSQL است.
قابلیتهای کلیدی:
- اتصال به MongoDB و MongoDB Atlas
- عملیات CRUD (Find, Insert, Update, Delete)
- Aggregation Pipeline برای کوئریهای پیچیده
- پشتیبانی از Connection String و فیلدهای جداگانه
- پشتیبانی از SSL/TLS
- کار با Nested Documents و Arrays
- پشتیبانی از Indexes
کاربردها:
- ذخیره لاگها و رویدادها
- مدیریت Session و Cache
- ذخیره دادههای IoT و سنسورها
- سیستمهای Content Management
- Real-time Analytics
- ذخیره پروفایل کاربران (Schema-less)
- Chat و Messaging Systems
چرا MongoDB؟
- Schema-less: نیاز به تعریف ساختار از قبل ندارید
- مقیاسپذیر: Horizontal Scaling آسان
- سرعت بالا: برای خواندن و نوشتن سریع
- انعطافپذیر: هر Document ساختار متفاوت داشته باشد
- داده JSON: سازگار با APIها و وب
احراز هویت
احراز هویت MongoDB
روش 1: Connection String (توصیه میشود)
mongodb://username:password@host:27017/database#### مثالها:
# Local MongoDB
mongodb://localhost:27017/myapp
# با احراز هویت
mongodb://n8n_user:MyPassword@192.168.1.100:27017/myapp
# MongoDB Atlas
mongodb+srv://n8n_user:MyPassword@cluster0.abc123.mongodb.net/myapp?retryWrites=true&w=majority
# Replica Set
mongodb://host1:27017,host2:27017,host3:27017/myapp?replicaSet=myReplicaSetروش 2: فیلدهای جداگانه
- 1Host: آدرس سرور (مثل localhost یا cluster0.abc123.mongodb.net)
- 2Port: 27017 (پیشفرض)
- 3Database: نام دیتابیس
- 4User: نام کاربری
- 5Password: رمز عبور
تنظیم MongoDB Atlas (ابری):
- 1به [MongoDB Atlas](https://cloud.mongodb.com) بروید
- 2Cluster بسازید (رایگان M0 موجود است)
- 3Database Access > Add Database User
- 4Network Access > Add IP Address (IP سرور n8n)
- 5Connect > Connect your application
- 6Connection String را کپی کنید
ایجاد کاربر MongoDB:
// اتصال به admin database
use admin
// ایجاد کاربر با دسترسی خواندن/نوشتن
db.createUser({
user: "n8n_user",
pwd: "StrongPassword123!",
roles: [
{ role: "readWrite", db: "myapp" }
]
})
// کاربر فقط خواندن
db.createUser({
user: "n8n_reader",
pwd: "ReadOnlyPass!",
roles: [
{ role: "read", db: "myapp" }
]
})نکات امنیتی:
- از MongoDB Atlas در Production استفاده کنید
- IP Whitelist را تنظیم کنید
- از Connection String با SRV استفاده کنید
- TLS/SSL را فعال کنید
- کاربر با حداقل دسترسی لازم بسازید
عملیاتهای موجود
find
جستجو و خواندن Documents از Collection
insertOne
درج یک Document جدید
insertMany
درج چندین Document همزمان
updateOne
بهروزرسانی اولین Document مطابق فیلتر
deleteOne
حذف اولین Document مطابق فیلتر
aggregate
اجرای Aggregation Pipeline برای تحلیل داده
کاربردهای متداول
1. ذخیره لاگ فعالیتها
ذخیره هر رویداد به عنوان Document:
هر رویداد → MongoDB (Insert One)
- Collection: activity_logs
- Document:
{
"userId": "{{$json.userId}}",
"action": "{{$json.action}}",
"details": {{$json.details}},
"ip": "{{$json.ip}}",
"userAgent": "{{$json.userAgent}}",
"timestamp": "{{$now.toISO()}}"
}2. مدیریت Session کاربران
ذخیره و بررسی Session:
Webhook (Login)
→ MongoDB (Insert One)
Collection: sessions
{
"userId": "{{$json.userId}}",
"token": "{{$json.token}}",
"expiresAt": "{{$now.plus({hours: 24}).toISO()}}",
"device": "{{$json.device}}"
}
Webhook (Check Session)
→ MongoDB (Find)
Collection: sessions
Query: {
"token": "{{$json.token}}",
"expiresAt": {"$gt": "{{$now.toISO()}}"}
}3. سیستم Cache
ذخیره نتایج API با TTL:
Webhook (درخواست)
→ MongoDB (Find)
Collection: cache
Query: {"key": "{{$json.cacheKey}}"}
→ IF (نتیجه پیدا شد و منقضی نشده)
→ True: برگرداندن از Cache
→ False:
→ HTTP Request (فراخوانی API اصلی)
→ MongoDB (Update One, upsert: true)
Filter: {"key": "{{$json.cacheKey}}"}
Update: {
"$set": {
"value": {{$json.result}},
"expiresAt": "{{$now.plus({minutes: 30}).toISO()}}"
}
}4. آمار و گزارش با Aggregation
گزارش فروش ماهانه:
Schedule (اول هر ماه) → MongoDB (Aggregate)
Collection: orders
Pipeline: [
{"$match": {"status": "completed"}},
{"$group": {
"_id": {"$month": "$createdAt"},
"totalSales": {"$sum": "$amount"},
"orderCount": {"$sum": 1},
"avgOrder": {"$avg": "$amount"}
}},
{"$sort": {"_id": -1}},
{"$limit": 12}
]
→ Set (فرمت فارسی)
→ Telegram (ارسال گزارش)5. جستجوی محصولات
API جستجو با فیلتر:
Webhook (جستجو) → MongoDB (Find)
Collection: products
Query: {
"$and": [
{"name": {"$regex": "{{$json.keyword}}", "$options": "i"}},
{"price": {"$gte": {{$json.minPrice}}, "$lte": {{$json.maxPrice}}}},
{"category": "{{$json.category}}"},
{"inStock": true}
]
}
Sort: {"price": 1}
Limit: 20
→ Respond to Webhook6. سیستم نظرات
ذخیره و خواندن نظرات:
Webhook (نظر جدید) → MongoDB (Insert One)
Collection: reviews
{
"productId": "{{$json.productId}}",
"userId": "{{$json.userId}}",
"rating": {{$json.rating}},
"comment": "{{$json.comment}}",
"createdAt": "{{$now.toISO()}}"
}
-- خواندن نظرات یک محصول با آمار:
MongoDB (Aggregate)
Pipeline: [
{"$match": {"productId": "product123"}},
{"$group": {
"_id": null,
"avgRating": {"$avg": "$rating"},
"totalReviews": {"$sum": 1},
"reviews": {"$push": "$$ROOT"}
}}
]7. Chat System
ذخیره و خواندن پیامها:
Webhook (پیام جدید) → MongoDB (Insert One)
Collection: messages
{
"roomId": "{{$json.roomId}}",
"sender": "{{$json.userId}}",
"text": "{{$json.message}}",
"type": "text",
"read": false,
"createdAt": "{{$now.toISO()}}"
}
-- خواندن پیامهای یک اتاق:
MongoDB (Find)
Collection: messages
Query: {"roomId": "{{$json.roomId}}"}
Sort: {"createdAt": -1}
Limit: 508. شمارنده بازدید
افزایش خودکار بازدید:
Webhook (بازدید صفحه) → MongoDB (Update One)
Collection: page_views
Filter: {"pageId": "{{$json.pageId}}"}
Update: {
"$inc": {"views": 1},
"$set": {"lastViewed": "{{$now.toISO()}}"},
"$push": {"visitors": {"ip": "{{$json.ip}}", "date": "{{$now.toISO()}}"}}
}
Upsert: true9. داده IoT و سنسورها
ذخیره داده سنسورها:
MQTT/Webhook (داده سنسور) → MongoDB (Insert One)
Collection: sensor_data
{
"sensorId": "{{$json.sensorId}}",
"temperature": {{$json.temp}},
"humidity": {{$json.humidity}},
"timestamp": "{{$now.toISO()}}"
}10. Soft Delete
حذف نرم رکوردها:
Webhook (حذف) → MongoDB (Update One)
Collection: users
Filter: {"_id": "{{$json.userId}}"}
Update: {
"$set": {
"deletedAt": "{{$now.toISO()}}",
"isActive": false
}
}نکات حرفهای
نکات حرفهای
- 1Query Operators: عملگرهای مقایسه:
{"age": {"$gt": 18}} // بزرگتر از
{"age": {"$gte": 18}} // بزرگتر مساوی
{"age": {"$lt": 30}} // کوچکتر از
{"price": {"$in": [100, 200]}} // در لیست
{"status": {"$ne": "deleted"}} // نامساوی
{"name": {"$regex": "ali", "$options": "i"}} // Regex- 1Update Operators: عملگرهای بهروزرسانی:
{"$set": {"name": "Ali"}} // تنظیم مقدار
{"$unset": {"temp": ""}} // حذف فیلد
{"$inc": {"views": 1}} // افزایش
{"$push": {"tags": "new"}} // اضافه به آرایه
{"$pull": {"tags": "old"}} // حذف از آرایه
{"$addToSet": {"tags": "unique"}} // اضافه بدون تکرار
{"$rename": {"old": "new"}} // تغییر نام فیلد- 1Projection: فقط فیلدهای لازم:
{"name": 1, "email": 1, "_id": 0}- 1Aggregation Stages: مراحل Pipeline:
{"$match": {}} // فیلتر
{"$group": {}} // گروهبندی
{"$sort": {}} // مرتبسازی
{"$limit": 10} // محدود کردن
{"$skip": 20} // رد کردن
{"$project": {}} // انتخاب فیلد
{"$unwind": "$arr"} // باز کردن آرایه
{"$lookup": {}} // JOIN- 1Lookup (JOIN):
{
"$lookup": {
"from": "customers",
"localField": "customerId",
"foreignField": "_id",
"as": "customer"
}
}- 1Index Strategy:
// Single field
db.users.createIndex({"email": 1})
// Compound
db.orders.createIndex({"status": 1, "createdAt": -1})
// TTL (حذف خودکار)
db.sessions.createIndex({"expiresAt": 1}, {expireAfterSeconds: 0})
// Text (جستجوی متنی)
db.articles.createIndex({"title": "text", "content": "text"})- 1TTL Index: حذف خودکار رکوردهای قدیمی:
// حذف Sessions بعد از 24 ساعت
db.sessions.createIndex(
{"createdAt": 1},
{expireAfterSeconds: 86400}
)- 1Pagination: صفحهبندی:
// صفحه 3 (هر صفحه 20 رکورد)
Skip: 40
Limit: 20
Sort: {"createdAt": -1}- 1Bulk Operations: عملیات دستهای سریعتر از تکی.
- 1Connection Pooling: اگر درخواست زیاد دارید، maxPoolSize را تنظیم کنید:
mongodb://user:pass@host:27017/db?maxPoolSize=50- 1Backup خودکار:
Schedule (هر شب) → Bash (mongodump)
→ Google Drive (آپلود بکآپ)- 1دسترسی به ObjectId در n8n:
// ID Document
{{$json._id}}
// تبدیل string به ObjectId در کوئری
{"_id": {"$oid": "{{$json.id}}"}}- 1فرمت تاریخ:
// ذخیره تاریخ
{"createdAt": {"$date": "{{$now.toISO()}}"}}- 1Monitoring: از MongoDB Compass برای مانیتورینگ ویژوال استفاده کنید.
- 1Schema Validation: (اختیاری)
db.createCollection("orders", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["customerId", "amount"],
properties: {
amount: {bsonType: "number", minimum: 0}
}
}
}
})رفع مشکلات
خطاهای رایج
1. خطای "Connection timeout"
علت: MongoDB در دسترس نیست
راهحل
- بررسی وضعیت MongoDB:
sudo systemctl status mongod - Host و Port را بررسی کنید
- برای Atlas: IP را Whitelist کنید
- Firewall: پورت 27017 باز باشد
- Connection String: آدرس صحیح استفاده شود
2. خطای "Authentication failed"
علت: اطلاعات کاربری اشتباه
راهحل
- Username/Password را بررسی کنید
- دیتابیس Authentication درست باشد (
authSource=admin) - Connection String:
mongodb://user:pass@host:27017/mydb?authSource=admin3. خطای "Namespace not found"
علت: Collection وجود ندارد
راهحل
- نام Collection را بررسی کنید (Case-sensitive)
- MongoDB در Insert خودکار Collection میسازد
- لیست Collections:
db.getCollectionNames()4. خطای "Document exceeds max size"
علت: اندازه Document بیش از 16MB
راهحل
- فایلهای بزرگ را در GridFS ذخیره کنید
- داده را به Documents کوچکتر تقسیم کنید
- Binary data را جداگانه ذخیره کنید
5. خطای "E11000 duplicate key"
علت: مقدار Unique Index تکراری
راهحل
- قبل از Insert بررسی کنید رکورد موجود نیست
- از
updateOneباupsert: trueاستفاده کنید - Index Unique را بررسی کنید:
db.collection.getIndexes()6. خطای "Query timeout" (Slow Query)
علت: کوئری بهینه نیست
راهحل
- Index اضافه کنید:
db.collection.createIndex({"email": 1})
db.collection.createIndex({"status": 1, "createdAt": -1})- از
.explain()برای تحلیل استفاده کنید - Projection استفاده کنید (فقط فیلدهای لازم)
7. خطای "Network Error" با Atlas
علت: IP مجاز نیست
راهحل
- MongoDB Atlas > Network Access
- IP سرور n8n را اضافه کنید
- یا
0.0.0.0/0برای همه (فقط تست)
