MongoDB va Node.js: driver bilan ulanish

Shu paytgacha barcha so’rovlarni mongosh da qo’lda yozdingiz. Haqiqiy ilovada esa so’rovni odam emas, kod yuboradi: foydalanuvchi tugma bosadi, server bazaga murojaat qiladi, natija sahifaga qaytadi.

Bu darsda bazani Node.js ilovasiga ulaymiz.

Loyihani tayyorlash

Qadamlar:

mkdir mongo-start
cd mongo-start
npm init -y
Wrote to D:\mongo-start\package.json

{
  "name": "mongo-start",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

Rasmiy driverni o’rnatamiz:

npm install mongodb
added 12 packages, and audited 13 packages in 3s

found 0 vulnerabilities

ES modul sintaksisini ishlatish uchun package.json ga bitta qator qo’shing:

{
  "name": "mongo-start",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js"
}

Modul tizimi darsida ko’rganingizdek, type maydoni import yozuvini yoqadi.

Birinchi ulanish

connect.js faylini yarating:

import { MongoClient } from "mongodb";

const uri = "mongodb://127.0.0.1:27017";
const client = new MongoClient(uri);

try {
  await client.connect();
  // Baza javob berayotganini tekshiramiz
  await client.db("admin").command({ ping: 1 });
  console.log("Ulanish muvaffaqiyatli");
} catch (error) {
  console.error("Ulanib bo'lmadi:", error.message);
} finally {
  await client.close();
  console.log("Ulanish yopildi");
}
node connect.js
Ulanish muvaffaqiyatli
Ulanish yopildi

Atlas ishlatayotgan bo’lsangiz, uri boshqacha bo’ladi:

const uri = "mongodb+srv://learner:PAROL@cluster0.abcde.mongodb.net/";

Ulanish satrini kodga yozmang

Yuqoridagi satrda parol ochiq turibdi. Bu kod Git’ga tushsa, parol ham tushadi.

.env fayl yarating:

MONGODB_URI=mongodb://127.0.0.1:27017

Va uni .gitignore ga qo’shing:

node_modules
.env

Node.js .env faylini o’zi o’qiy oladi:

import { MongoClient } from "mongodb";

const uri = process.env.MONGODB_URI;

if (!uri) {
  console.error("MONGODB_URI o'rnatilmagan");
  process.exit(1);
}

const client = new MongoClient(uri);
await client.connect();
console.log("Ulanish manzili o'qildi");
await client.close();
node --env-file=.env env-demo.js
Ulanish manzili o'qildi

Baza va kolleksiyani olish

Ulanishdan keyin baza va kolleksiya obyektlari olinadi:

import { MongoClient } from "mongodb";

const client = new MongoClient("mongodb://127.0.0.1:27017");
await client.connect();

const database = client.db("shop");
const products = database.collection("products");

const count = await products.countDocuments();
console.log("Kolleksiyadagi hujjatlar:", count);

await client.close();
node count-demo.js
Kolleksiyadagi hujjatlar: 0

Baza va kolleksiya oldindan mavjud bo’lishi shart emas — birinchi yozuvda yaratiladi.

Hujjat qo’shish

import { MongoClient } from "mongodb";

const client = new MongoClient("mongodb://127.0.0.1:27017");

try {
  await client.connect();
  const products = client.db("shop").collection("products");

  const one = await products.insertOne({
    name: "O'tkan kunlar",
    category: "kitob",
    price: 45000,
    quantity: 12,
    createdAt: new Date(),
  });
  console.log("Qo'shildi:", one.insertedId.toString());

  const many = await products.insertMany([
    { name: "Daftar", category: "kanselyariya", price: 9500, quantity: 150 },
    { name: "Ruchka", category: "kanselyariya", price: 4500, quantity: 300 },
  ]);
  console.log("Qo'shilganlar soni:", many.insertedCount);
} catch (error) {
  console.error("Xato:", error.message);
} finally {
  await client.close();
}
node insert-demo.js
Qo'shildi: 671fca1b2c3d4e5f6a7b8c71
Qo'shilganlar soni: 2

Metod nomlari mongosh dagi bilan aynan bir xil: insertOne, insertMany. Farq bitta — har chaqiruv oldiga await qo’yiladi.

O’qish: find va toArray

Bu yerda mongosh dan eng sezilarli farq bor:

import { MongoClient } from "mongodb";

const client = new MongoClient("mongodb://127.0.0.1:27017");

try {
  await client.connect();
  const products = client.db("shop").collection("products");

  const one = await products.findOne({ category: "kitob" });
  console.log("Bitta hujjat:", one.name);

  const cheap = await products
    .find({ price: { $lt: 20000 } })
    .sort({ price: 1 })
    .limit(5)
    .toArray();

  console.log("Topildi:", cheap.length);
  for (const product of cheap) {
    console.log(`${product.name} — ${product.price}`);
  }
} catch (error) {
  console.error("Xato:", error.message);
} finally {
  await client.close();
}
node find-demo.js
Bitta hujjat: O'tkan kunlar
Topildi: 2
Ruchka — 4500
Daftar — 9500

Yangilash va o’chirish

import { MongoClient } from "mongodb";

const client = new MongoClient("mongodb://127.0.0.1:27017");

try {
  await client.connect();
  const products = client.db("shop").collection("products");

  const updated = await products.updateOne(
    { name: "Daftar" },
    { $set: { price: 10000 }, $inc: { quantity: -5 } }
  );
  console.log("Topildi:", updated.matchedCount, "o'zgardi:", updated.modifiedCount);

  const deleted = await products.deleteMany({ price: { $lt: 5000 } });
  console.log("O'chirildi:", deleted.deletedCount);
} catch (error) {
  console.error("Xato:", error.message);
} finally {
  await client.close();
}
node update-demo.js
Topildi: 1 o'zgardi: 1
O'chirildi: 1

Natija obyektlari yangilash va o’chirish darslaridagi bilan bir xil.

_id bo’yicha ishlash

Kodda _id odatda matn sifatida keladi — URL parametridan yoki forma maydonidan. Uni ObjectId ga aylantirish kerak:

import { MongoClient, ObjectId } from "mongodb";

const client = new MongoClient("mongodb://127.0.0.1:27017");

try {
  await client.connect();
  const products = client.db("shop").collection("products");

  const first = await products.findOne({});
  const idAsString = first._id.toString();
  console.log("Matn ko'rinishidagi id:", idAsString);

  // Matnni qaytadan ObjectId ga aylantiramiz
  const found = await products.findOne({ _id: new ObjectId(idAsString) });
  console.log("Topildi:", found.name);
} catch (error) {
  console.error("Xato:", error.message);
} finally {
  await client.close();
}
node objectid-demo.js
Matn ko'rinishidagi id: 671fca1b2c3d4e5f6a7b8c71
Topildi: O'tkan kunlar

Ulanishni qayta-qayta ochmang

Yuqoridagi misollar qisqa skript bo’lgani uchun har safar ulanib, yopilyapti. Server ilovasida bunday qilinmaydi.

database.js faylini yarating:

import { MongoClient } from "mongodb";

const uri = process.env.MONGODB_URI ?? "mongodb://127.0.0.1:27017";
const client = new MongoClient(uri);

let isConnected = false;

export async function getCollection(name) {
  if (!isConnected) {
    await client.connect();
    isConnected = true;
  }
  return client.db("shop").collection(name);
}

export async function closeConnection() {
  if (isConnected) {
    await client.close();
    isConnected = false;
  }
}

Ishlatilishi:

import { getCollection, closeConnection } from "./database.js";

const products = await getCollection("products");

const all = await products.find({}).sort({ price: 1 }).toArray();
console.log("Jami mahsulotlar:", all.length);

for (const product of all) {
  console.log(`${product.name} — ${product.price}`);
}

await closeConnection();
node app.js
Jami mahsulotlar: 2
Daftar — 10000
O'tkan kunlar — 45000

Amaliy mashq

mongo-start papkasida bajaring:

  1. npm init -y va npm install mongodb bilan loyihani tayyorlang, package.json ga "type": "module" qo’shing.
  2. connect.js yozib, ping buyrug’i bilan ulanishni tasdiqlang.
  3. Serverni to’xtatib, shu skriptni qayta yurgizing — try/catch xatoni ushlashini va dastur yiqilmasligini ko’ring.
  4. insertMany bilan uchta mahsulot qo’shing va insertedCount ni chiqaring.
  5. find() natijasini toArray() siz ishlatib ko’ring, so’ng toArray() qo’shib farqni solishtiring.
  6. Bitta hujjat _id sini toString() bilan matnga aylantiring va new ObjectId(...) bilan qaytadan qidiring.

5-qadam Node.js driverida eng ko’p vaqt yeydigan chalkashlikni ko’rsatadi: kursor va massiv bir narsa emas.

Qisqacha xulosa

  • Rasmiy driver npm install mongodb bilan o’rnatiladi.
  • MongoClient ulanishni ochadi, client.db() va .collection() bilan kolleksiyaga yetiladi.
  • Metod nomlari mongosh dagi bilan bir xil, lekin har biri oldiga await qo’yiladi.
  • find() kursor qaytaraditoArray() yoki for await bilan ochiladi.
  • _id matn sifatida kelsa, new ObjectId(...) bilan aylantiriladi va avval ObjectId.isValid() bilan tekshiriladi.
  • Ulanish satri kodga emas, .env fayliga yoziladi va .gitignore ga qo’shiladi.
  • Butun ilova uchun bitta MongoClient, va bazaga murojaat try/catch/finally ichida bo’ladi.

Shu bilan MongoDB boshlang’ich darajasi yakunlandi. Bilimni amalda sinash uchun Express bo’limidagi API’ga shu bazani ulab ko’ring.

Bu dars foydali bo'ldimi?

marta ko'rildi