Aggregation Pipeline үндэс
find нь document-уудыг олж буцаадаг. Харин Aggregation Pipeline нь өгөгдлийг дүгнэх, хувиргах, нэгтгэх боломж олгодог — тоолох, нийлбэр гаргах, дундаж тооцох гэх мэт.
Pipeline гэж юу вэ?
Pipeline бол үе шатуудын дараалал (stages). Өгөгдөл нэг stage-ийн гаралт нь дараагийн stage-ийн оролт болж дамждаг — үйлдвэрийн угсрах дамжлага шиг.
[Collection] → [$match] → [$group] → [$sort] → [Үр дүн]
aggregate()
// Хэлбэр:
db.collection.aggregate([
{ $stage1: { ... } },
{ $stage2: { ... } },
{ $stage3: { ... } }
])
Массив дотрох объект бүр нэг stage.
$match — шүүх
find-ийн шүүлттэй адил. Query operator-уудыг бүгдийг нь ашиглаж болно.
db.orders.aggregate([{ $match: { status: "completed" } }]);
// Pipeline-д $match-ийг аль болох эхэнд тавь — тэгж байж
// дараагийн stage-үүд бага document-тай ажиллана (хурд нэмэгдэнэ)
$group — бүлэглэх
$group нь document-уудыг тодорхой талбараар бүлэглэж нэгтгэнэ.
db.orders.aggregate([
{
$group: {
_id: "$status", // status-аар бүлэглэх
totalOrders: { $sum: 1 }, // бүлэг бүрийн тоог тоол
},
},
]);
// Үр дүн:
// { _id: "completed", totalOrders: 142 }
// { _id: "pending", totalOrders: 38 }
// { _id: "cancelled", totalOrders: 21 }
_id: null өгвөл бүх collection нэг бүлэгт орно:
db.orders.aggregate([
{
$group: {
_id: null,
grandTotal: { $sum: "$amount" },
orderCount: { $sum: 1 },
},
},
]);
// { _id: null, grandTotal: 15830000, orderCount: 201 }
$sort — эрэмбэлэх
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$city", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }, // Нийлбэрээр буурах дараалал
]);
$limit ба $skip
db.products.aggregate([{ $sort: { price: -1 } }, { $skip: 10 }, { $limit: 5 }]);
$project — талбар сонгох, нэрлэх
Projection-тэй төстэй боловч computed талбар нэмэх боломжтой:
db.users.aggregate([
{
$project: {
_id: 0,
username: 1,
email: 1,
isAdult: { $gte: ["$age", 18] }, // computed талбар
},
},
]);
// Үр дүн:
// { username: "bold", email: "bold@example.com", isAdult: true }
Stage-үүдийг хослуулах
// Хот бүрийн хэрэглэгчдийн дундаж нас, 18+ хэрэглэгчдээс
db.users.aggregate([
{ $match: { age: { $gte: 18 } } }, // 1. шүүх
{
$group: {
_id: "$city",
avgAge: { $avg: "$age" },
count: { $sum: 1 },
},
}, // 2. бүлэглэх
{ $sort: { count: -1 } }, // 3. тоогоор эрэмбэлэх
{ $limit: 5 }, // 4. топ 5
]);
find() vs aggregate()
| | find() | aggregate() | | ------------------ | -------------- | ----------------------------- | | Зорилго | Document хайх | Дүгнэлт, хувиргалт | | Хурд | Хурдан | Нарийн тооцоололд тохиромжтой | | Уян хатан байдал | Хязгаарлагдмал | Маш өргөн | | Хэрэглэх тохиолдол | Энгийн CRUD | Тайлан, статистик, JOIN |
Дараагийн хичээлд:
$group дотор ашиглагдах $sum, $avg, $min, $max зэрэг нэгтгэх операторуудыг дэлгэрэнгүй үзнэ.