MongoDB / Projection

Projection

find хийхэд MongoDB document-ийн бүх талбарыг буцаадаг. Projection ашиглан зөвхөн хэрэгтэй талбаруудаа сонгон авч болно — энэ нь сүлжээний ачааллыг багасгаж, аппликейшны гүйцэтгэлийг сайжруулдаг.

Үндсэн хэлбэр

find-ийн хоёр дахь аргумент нь projection:

javascript
db.collection.find(
  {
    /* шүүлт */
  },
  {
    /* projection */
  },
);

Include projection — талбаруудыг оруулах (1)

Талбарт 1 өгвөл зөвхөн тэр талбар буцна.

javascript
// Зөвхөн username ба email авах
db.users.find({}, { username: 1, email: 1 });

Үр дүн:

javascript
{ _id: ObjectId("..."), username: "bold", email: "bold@example.com" }
{ _id: ObjectId("..."), username: "dorj",  email: "dorj@example.com" }

_id нь тусгайлан хасаагүй бол автоматаар буцдаг.

Exclude projection — талбаруудыг хасах (0)

Талбарт 0 өгвөл тэр талбар хасагдана, бусад нь бүгд буцна.

javascript
// password болон __v хасаад бусдыг нь авах
db.users.find({}, { password: 0, __v: 0 });

_id хасах

_id: 0 гэж тусгайлан заасан тохиолдолд л _id буцахгүй:

javascript
// _id хасаад зөвхөн username ба email авах
db.users.find({}, { _id: 0, username: 1, email: 1 });

Үр дүн:

javascript
{ username: "bold", email: "bold@example.com" }
{ username: "dorj",  email: "dorj@example.com" }

Include ба Exclude хольж болохгүй

Нэг projection дотор include (1) ба exclude (0) хольж болохгүй — зөвхөн _id: 0 нь үл хамаарах зүйл:

javascript
// ❌ Алдаа — 1 ба 0 хольж болохгүй
db.users.find({}, { username: 1, age: 0 });

// ✅ Зөв — бүгдийг include хийж, _id-г хасах
db.users.find({}, { username: 1, email: 1, _id: 0 });

// ✅ Зөв — бүгдийг exclude хийх
db.users.find({}, { password: 0, token: 0 });

Nested талбар сонгох (dot notation)

javascript
// profile дотроос зөвхөн city авах
db.users.find({}, { "profile.city": 1, username: 1 });

// Үр дүн:
// { _id: ..., username: "bold", profile: { city: "Улаанбаатар" } }

Массив дотроос сонгох

$slice — массивын тодорхой тооны элемент авах

javascript
// skills массивын эхний 3 элемент авах
db.users.find({}, { skills: { $slice: 3 } });

// Сүүлийн 2 элемент авах
db.users.find({}, { skills: { $slice: -2 } });

// 2-р байрнаас эхлэн 3 элемент авах [skip, limit]
db.users.find({}, { skills: { $slice: [2, 3] } });

findOne-д projection ашиглах

javascript
// Нэвтрэх үед зөвхөн хэрэгтэй талбаруудыг авах
db.users.findOne(
  { email: "bold@example.com" },
  { password: 1, username: 1, role: 1 },
);

Жишээ: API хариунд projection

javascript
// Хэрэглэгчийн нийтийн профайл — нууц мэдээлэл хасагдсан
db.users.find(
  { username: "bold" },
  {
    _id: 0,
    username: 1,
    "profile.bio": 1,
    "profile.city": 1,
    skills: 1,
    xp: 1,
  },
);

// Үр дүн:
// {
//   username: "bold",
//   profile: { bio: "Программист", city: "Улаанбаатар" },
//   skills: ["JavaScript", "MongoDB"],
//   xp: 350
// }

Projection нь зөвхөн үр дүнд нөлөөлдөг — database дотор хадгалагдах document-д нөлөөлөхгүй.

Дараагийн хичээлд:

sort, limit, skip ашиглан query-ийн үр дүнг эрэмбэлэх ба хязгаарлах талаар үзнэ.