find ба findOne
Collection-д байгаа document-уудыг унших хамгийн үндсэн арга бол find() ба findOne(). Хайлтын нөхцөл (filter) тодорхойлж хэрэгтэй document-уудаа олно.
Жишээ өгөгдөл бэлдэх
Дараах хичээлүүдэд ашиглах өгөгдлийг эхлээд оруулна:
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 унших
db.collection.find(filter, projection);
filter— хайлтын нөхцөл (заавал биш — хоосон бол бүгдийг буцаана)projection— аль талбаруудыг буцаах (заавал биш)
Бүх document унших
db.students.find();
// Гаралт:
// [
// { _id: ObjectId('...'), name: 'Болд Батаа', age: 22, city: 'Улаанбаатар', ... },
// { _id: ObjectId('...'), name: 'Дорж Мөнх', age: 25, city: 'Дархан', ... },
// ...
// ]
{} дамжуулах нь мөн адил:
db.students.find({});
Filter ашиглан хайх
// Улаанбаатарын оюутнууд
db.students.find({ city: "Улаанбаатар" });
// Гаралт: Болд, Нараа, Батзориг (3 document)
// Бүртгэлтэй оюутнууд
db.students.find({ enrolled: true });
// Хот ба бүртгэл хоёулаа нөхцөлтэй (AND)
db.students.find({ city: "Улаанбаатар", enrolled: true });
findOne — нэг document унших
db.collection.findOne(filter);
Нөхцөлд тохирох эхний document-г буцаана. Олдохгүй бол null буцаана.
// Нэрээр хайх
db.students.findOne({ name: "Болд Батаа" });
// Гаралт:
// {
// _id: ObjectId('...'),
// name: 'Болд Батаа',
// age: 22,
// city: 'Улаанбаатар',
// gpa: 3.8,
// enrolled: true
// }
// Олдохгүй бол null
db.students.findOne({ name: "Тэмүүжин" });
// Гаралт: null
_id-аар хайх
// ObjectId бол тэмдэглэгээтэй оруулна
db.students.findOne({ _id: ObjectId("64abc1234567890abcdef012") });
Cursor
find() нь дүнгийн жагсаалтыг шууд биш cursor буцаана. Cursor бол өгөгдлийг хэсэгчлэн унших заагч.
mongosh дотор cursor автоматаар эхний 20 document-г харуулна. Цааш харахын тулд:
// Cursor-г давтах
const cursor = db.students.find();
while (cursor.hasNext()) {
printjson(cursor.next());
}
toArray() — бүгдийг массив болгох
const allStudents = db.students.find().toArray();
// allStudents нь JavaScript array болно
forEach() — давтах
db.students.find({ enrolled: true }).forEach((student) => {
print(student.name + " — " + student.city);
});
// Гаралт:
// Болд Батаа — Улаанбаатар
// Дорж Мөнх — Дархан
// Нараа Сүрэн — Улаанбаатар
// Батзориг — Улаанбаатар
pretty() — цэгцтэй харагдац
mongosh дотор JSON цэгцтэй харахын тулд:
db.students.find().pretty();
Анхаарна уу: Шинэ хувилбарын mongosh-д гаралт аяндаа цэгцтэй харагддаг тул
pretty()заавал биш.
Nested field-ээр хайх
Dot notation ашиглан дотоод объектийн талбараар хайна:
// address.city талбараар хайх
db.students.findOne({ "address.city": "Улаанбаатар" });
Хашилт ("address.city") заавал хэрэгтэй — хашилтгүй бол алдаа гарна.
db.employees.insertMany([
{ name: "Болд", address: { city: "Улаанбаатар", district: "Баянзүрх" } },
{ name: "Нараа", address: { city: "Дархан", district: "Дархан" } },
]);
db.employees.find({ "address.city": "Улаанбаатар" });
// Гаралт: Болд
Array-ийн утгаар хайх
db.students.insertMany([
{ name: "Анхаа", skills: ["MongoDB", "JavaScript"] },
{ name: "Дорж", skills: ["Python", "MongoDB"] },
{ name: "Нараа", skills: ["React", "CSS"] },
]);
// "MongoDB" дурдагдсан бүх document
db.students.find({ skills: "MongoDB" });
// Гаралт: Анхаа, Дорж
countDocuments — тоолох
// Нийт оюутны тоо
db.students.countDocuments();
// Гаралт: 5
// Улаанбаатарын оюутны тоо
db.students.countDocuments({ city: "Улаанбаатар" });
// Гаралт: 3
find vs findOne харьцуулалт
| | find() | findOne() |
| ------------------ | ----------------- | -------------------------------------- |
| Буцаадаг | Cursor (олон doc) | Нэг document / null |
| Хурд | — | Арай хурдан (эхнийхийг олмогц зогсоно) |
| Хэрэглэх тохиолдол | Жагсаалт | ID-аар хайх, нэг зүйл олох |
Бодит жишээ — хэрэглэгч олох
// Нэвтрэх үед email-ээр хайх
const user = db.users.findOne({ email: "bold@example.com" });
if (user) {
print("Тавтай морил, " + user.name);
} else {
print("Хэрэглэгч олдсонгүй");
}
// Идэвхтэй бүх хэрэглэгчийн нэрс
db.users.find({ isActive: true }).forEach((u) => print(u.name));
Дараагийн хичээлд:
$eq, $gt, $in зэрэг query operator ашиглан нарийн нөхцөлтэй хайлт хийнэ.