MongoDB / find ба findOne

find ба findOne

Collection-д байгаа document-уудыг унших хамгийн үндсэн арга бол find() ба findOne(). Хайлтын нөхцөл (filter) тодорхойлж хэрэгтэй document-уудаа олно.

Жишээ өгөгдөл бэлдэх

Дараах хичээлүүдэд ашиглах өгөгдлийг эхлээд оруулна:

javascript
use school

db.students.insertMany([
  { name: "Болд Батаа",   age: 22, city: "Улаанбаатар", gpa: 3.8, enrolled: true  },
  { name: "Дорж Мөнх",   age: 25, city: "Дархан",        gpa: 3.5, enrolled: true  },
  { name: "Нараа Сүрэн", age: 20, city: "Улаанбаатар",  gpa: 3.9, enrolled: true  },
  { name: "Анхаа Дорж",  age: 21, city: "Эрдэнэт",      gpa: 3.2, enrolled: false },
  { name: "Батзориг",    age: 24, city: "Улаанбаатар",  gpa: 3.6, enrolled: true  }
])

find — олон document унших

javascript
db.collection.find(filter, projection);
  • filter — хайлтын нөхцөл (заавал биш — хоосон бол бүгдийг буцаана)
  • projection — аль талбаруудыг буцаах (заавал биш)

Бүх document унших

javascript
db.students.find();

// Гаралт:
// [
//   { _id: ObjectId('...'), name: 'Болд Батаа', age: 22, city: 'Улаанбаатар', ... },
//   { _id: ObjectId('...'), name: 'Дорж Мөнх',  age: 25, city: 'Дархан', ... },
//   ...
// ]

{} дамжуулах нь мөн адил:

javascript
db.students.find({});

Filter ашиглан хайх

javascript
// Улаанбаатарын оюутнууд
db.students.find({ city: "Улаанбаатар" });

// Гаралт: Болд, Нараа, Батзориг (3 document)
javascript
// Бүртгэлтэй оюутнууд
db.students.find({ enrolled: true });
javascript
// Хот ба бүртгэл хоёулаа нөхцөлтэй (AND)
db.students.find({ city: "Улаанбаатар", enrolled: true });

findOne — нэг document унших

javascript
db.collection.findOne(filter);

Нөхцөлд тохирох эхний document-г буцаана. Олдохгүй бол null буцаана.

javascript
// Нэрээр хайх
db.students.findOne({ name: "Болд Батаа" });

// Гаралт:
// {
//   _id: ObjectId('...'),
//   name: 'Болд Батаа',
//   age: 22,
//   city: 'Улаанбаатар',
//   gpa: 3.8,
//   enrolled: true
// }
javascript
// Олдохгүй бол null
db.students.findOne({ name: "Тэмүүжин" });
// Гаралт: null

_id-аар хайх

javascript
// ObjectId бол тэмдэглэгээтэй оруулна
db.students.findOne({ _id: ObjectId("64abc1234567890abcdef012") });

Cursor

find() нь дүнгийн жагсаалтыг шууд биш cursor буцаана. Cursor бол өгөгдлийг хэсэгчлэн унших заагч.

mongosh дотор cursor автоматаар эхний 20 document-г харуулна. Цааш харахын тулд:

javascript
// Cursor-г давтах
const cursor = db.students.find();

while (cursor.hasNext()) {
  printjson(cursor.next());
}

toArray() — бүгдийг массив болгох

javascript
const allStudents = db.students.find().toArray();
// allStudents нь JavaScript array болно

forEach() — давтах

javascript
db.students.find({ enrolled: true }).forEach((student) => {
  print(student.name + " — " + student.city);
});

// Гаралт:
// Болд Батаа — Улаанбаатар
// Дорж Мөнх — Дархан
// Нараа Сүрэн — Улаанбаатар
// Батзориг — Улаанбаатар

pretty() — цэгцтэй харагдац

mongosh дотор JSON цэгцтэй харахын тулд:

javascript
db.students.find().pretty();

Анхаарна уу: Шинэ хувилбарын mongosh-д гаралт аяндаа цэгцтэй харагддаг тул pretty() заавал биш.


Nested field-ээр хайх

Dot notation ашиглан дотоод объектийн талбараар хайна:

javascript
// address.city талбараар хайх
db.students.findOne({ "address.city": "Улаанбаатар" });

Хашилт ("address.city") заавал хэрэгтэй — хашилтгүй бол алдаа гарна.

javascript
db.employees.insertMany([
  { name: "Болд", address: { city: "Улаанбаатар", district: "Баянзүрх" } },
  { name: "Нараа", address: { city: "Дархан", district: "Дархан" } },
]);

db.employees.find({ "address.city": "Улаанбаатар" });
// Гаралт: Болд

Array-ийн утгаар хайх

javascript
db.students.insertMany([
  { name: "Анхаа", skills: ["MongoDB", "JavaScript"] },
  { name: "Дорж", skills: ["Python", "MongoDB"] },
  { name: "Нараа", skills: ["React", "CSS"] },
]);

// "MongoDB" дурдагдсан бүх document
db.students.find({ skills: "MongoDB" });
// Гаралт: Анхаа, Дорж

countDocuments — тоолох

javascript
// Нийт оюутны тоо
db.students.countDocuments();
// Гаралт: 5

// Улаанбаатарын оюутны тоо
db.students.countDocuments({ city: "Улаанбаатар" });
// Гаралт: 3

find vs findOne харьцуулалт

| | find() | findOne() | | ------------------ | ----------------- | -------------------------------------- | | Буцаадаг | Cursor (олон doc) | Нэг document / null | | Хурд | — | Арай хурдан (эхнийхийг олмогц зогсоно) | | Хэрэглэх тохиолдол | Жагсаалт | ID-аар хайх, нэг зүйл олох |


Бодит жишээ — хэрэглэгч олох

javascript
// Нэвтрэх үед email-ээр хайх
const user = db.users.findOne({ email: "bold@example.com" });

if (user) {
  print("Тавтай морил, " + user.name);
} else {
  print("Хэрэглэгч олдсонгүй");
}
javascript
// Идэвхтэй бүх хэрэглэгчийн нэрс
db.users.find({ isActive: true }).forEach((u) => print(u.name));

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

$eq, $gt, $in зэрэг query operator ашиглан нарийн нөхцөлтэй хайлт хийнэ.