MongoDB / Aggregation Pipeline үндэс

Aggregation Pipeline үндэс

find нь document-уудыг олж буцаадаг. Харин Aggregation Pipeline нь өгөгдлийг дүгнэх, хувиргах, нэгтгэх боломж олгодог — тоолох, нийлбэр гаргах, дундаж тооцох гэх мэт.

Pipeline гэж юу вэ?

Pipeline бол үе шатуудын дараалал (stages). Өгөгдөл нэг stage-ийн гаралт нь дараагийн stage-ийн оролт болж дамждаг — үйлдвэрийн угсрах дамжлага шиг.

код
[Collection] → [$match] → [$group] → [$sort] → [Үр дүн]

aggregate()

javascript
// Хэлбэр:
db.collection.aggregate([
  { $stage1: { ... } },
  { $stage2: { ... } },
  { $stage3: { ... } }
])

Массив дотрох объект бүр нэг stage.

$match — шүүх

find-ийн шүүлттэй адил. Query operator-уудыг бүгдийг нь ашиглаж болно.

javascript
db.orders.aggregate([{ $match: { status: "completed" } }]);

// Pipeline-д $match-ийг аль болох эхэнд тавь — тэгж байж
// дараагийн stage-үүд бага document-тай ажиллана (хурд нэмэгдэнэ)

$group — бүлэглэх

$group нь document-уудыг тодорхой талбараар бүлэглэж нэгтгэнэ.

javascript
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 нэг бүлэгт орно:

javascript
db.orders.aggregate([
  {
    $group: {
      _id: null,
      grandTotal: { $sum: "$amount" },
      orderCount: { $sum: 1 },
    },
  },
]);
// { _id: null, grandTotal: 15830000, orderCount: 201 }

$sort — эрэмбэлэх

javascript
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$city", total: { $sum: "$amount" } } },
  { $sort: { total: -1 } }, // Нийлбэрээр буурах дараалал
]);

$limit ба $skip

javascript
db.products.aggregate([{ $sort: { price: -1 } }, { $skip: 10 }, { $limit: 5 }]);

$project — талбар сонгох, нэрлэх

Projection-тэй төстэй боловч computed талбар нэмэх боломжтой:

javascript
db.users.aggregate([
  {
    $project: {
      _id: 0,
      username: 1,
      email: 1,
      isAdult: { $gte: ["$age", 18] }, // computed талбар
    },
  },
]);

// Үр дүн:
// { username: "bold", email: "bold@example.com", isAdult: true }

Stage-үүдийг хослуулах

javascript
// Хот бүрийн хэрэглэгчдийн дундаж нас, 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 зэрэг нэгтгэх операторуудыг дэлгэрэнгүй үзнэ.