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-ийн үр дүнг эрэмбэлэх ба хязгаарлах талаар үзнэ.