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:
npm init -yvanpm install mongodbbilan loyihani tayyorlang,package.jsonga"type": "module"qo’shing.connect.jsyozib,pingbuyrug’i bilan ulanishni tasdiqlang.- Serverni to’xtatib, shu skriptni qayta yurgizing —
try/catchxatoni ushlashini va dastur yiqilmasligini ko’ring. insertManybilan uchta mahsulot qo’shing vainsertedCountni chiqaring.find()natijasinitoArray()siz ishlatib ko’ring, so’ngtoArray()qo’shib farqni solishtiring.- Bitta hujjat
_idsinitoString()bilan matnga aylantiring vanew 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 mongodbbilan o’rnatiladi. MongoClientulanishni ochadi,client.db()va.collection()bilan kolleksiyaga yetiladi.- Metod nomlari
mongoshdagi bilan bir xil, lekin har biri oldigaawaitqo’yiladi. find()kursor qaytaradi —toArray()yokifor awaitbilan ochiladi._idmatn sifatida kelsa,new ObjectId(...)bilan aylantiriladi va avvalObjectId.isValid()bilan tekshiriladi.- Ulanish satri kodga emas,
.envfayliga yoziladi va.gitignorega qo’shiladi. - Butun ilova uchun bitta
MongoClient, va bazaga murojaattry/catch/finallyichida bo’ladi.
Shu bilan MongoDB boshlang’ich darajasi yakunlandi. Bilimni amalda sinash uchun Express bo’limidagi API’ga shu bazani ulab ko’ring.