MongoDB Compass va mongosh — asosiy ishlatish

~15 daq · MongoDB · Kirish va O'rnatish

Muammodan boshlaylik

MongoDB o'rnatildi. Lekin hozir ichida nima bor? Qanday ko'raman? Buyruq yozish kerakmi, yoki oynali dastur bormi?

MongoDB bilan ishlashning ikki yo'li bor:

  • mongosh — terminal, matn buyruqlari
  • MongoDB Compass — grafik interfeys, sichqoncha bilan

Ikkalasini bilib olish muhim: Compass tez ko'rish uchun, mongosh real ishda. Ko'pchilik ikkalasini birgalikda ishlatadi.


MongoDB Compass — grafik interfeys

Compass — MongoDB ning rasmiy GUI (grafik interfeys) dasturi. O'rnatish kerak bo'lsa: https://www.mongodb.com/try/download/compass

Compass qanday ko'rinadi

┌─────────────────────────────────────────────────────────────────┐
│  MongoDB Compass                                          _ □ ×  │
├──────────────┬──────────────────────────────────────────────────┤
│              │                                                   │
│  ○ localhost │   maktab > talabalar                             │
│              │                                                   │
│  ▼ maktab    │  ┌─────────────────────────────────────────────┐ │
│    talabalar │  │  Documents    Aggregations    Schema   ...  │ │
│    o_qituvch │  ├─────────────────────────────────────────────┤ │
│              │  │  FILTER  { }            [FIND]  [RESET]     │ │
│  ▶ admin     │  ├─────────────────────────────────────────────┤ │
│  ▶ local     │  │  _id: ObjectId("64a1...")                   │ │
│              │  │  ism: "Jasur"                               │ │
│              │  │  yosh: 24                                   │ │
│              │  │  shahar: "Toshkent"                         │ │
│              │  ├─────────────────────────────────────────────┤ │
│              │  │  _id: ObjectId("64a2...")                   │ │
│              │  │  ism: "Malika"                              │ │
│              │  │  yosh: 22                                   │ │
│              │  │  shahar: "Samarqand"                        │ │
│              │  └─────────────────────────────────────────────┘ │
└──────────────┴──────────────────────────────────────────────────┘

Chap panel: databaselar va collectionlar daraxt shaklida. O'ng panel: tanlangan collection ning documentlari.

Compass ga ulanish

Compass ochilganda ulanish oynasi ko'rinadi:

┌──────────────────────────────────────────────┐
│  New Connection                              │
│                                              │
│  URI:  mongodb://localhost:27017             │
│                                              │
│  yoki qo'lda:                                │
│  Host: localhost        Port: 27017          │
│  Authentication: None (hozircha)             │
│                                              │
│              [ Connect ]                     │
└──────────────────────────────────────────────┘

Lokal o'rnatish uchun standart URI: mongodb://localhost:27017 Shunchaki "Connect" bosing — hamma narsa tayyor.


Compass panellari — nima uchun nima

Biror collectionni ochganda yuqorida 5 ta tab ko'rinadi:

┌────────────┬───────────────┬────────┬──────────┬──────────┐
│  Documents │  Aggregations │ Schema │ Indexes  │ Explain  │
└────────────┴───────────────┴────────┴──────────┴──────────┘
     ↑               ↑           ↑         ↑           ↑
  Ma'lumot       Pipeline    Maydon     Index      So'rov
  ko'rish        qurish       tahlili   boshqarish  rejasi

Documents — documentlarni ko'rish, filter, tahrirlash, o'chirish.

Aggregations — pipeline ni sichqoncha bilan bosqichma-bosqich qurish. Har bosqich natijasini darhol ko'rish mumkin.

Schema — collection dagi maydonlarni tahlil qiladi:

┌─────────────────────────────────────────────────────┐
│  Schema Analysis                                    │
├──────────────┬──────────┬────────────────────────── │
│  Field       │  Type    │  Distribution             │
├──────────────┼──────────┼────────────────────────── │
│  _id         │ ObjectId │ ████████████████ 100%     │
│  ism         │ String   │ ████████████████ 100%     │
│  yosh        │ Int32    │ ████████████████ 100%     │
│  shahar      │ String   │ ████████████  87%         │
│  telefon     │ Array    │ ████████  50%             │
└──────────────┴──────────┴────────────────────────── │

shahar faqat 87% documentda bor — ya'ni 13% document da bu maydon yo'q. Schema tab bu farqlarni darhol ko'rsatadi.

Indexes — mavjud indexlar ro'yxati, yangi index yaratish.

Explain Plan — so'rov qanday bajarilishini vizual ko'rsatadi (keyingi darslarda batafsil).


Documents tabida filter yozish

┌─────────────────────────────────────────────────────┐
│  FILTER  { yosh: { $gt: 20 } }        [FIND]        │
└─────────────────────────────────────────────────────┘

Filter maydoniga oddiy MongoDB query yozing. Compass darhol natijani ko'rsatadi. Bu mongosh da db.talabalar.find(...) ga teng.


mongosh — terminal interfeysi

mongosh — MongoDB ning zamonaviy shell i. mongo ning yangi versiyasi.

mongosh ni ishga tushirish

mongosh

Ulanish muvaffaqiyatli bo'lsa:

Current Mongosh Log ID: 64a1f2c3b4e5f6a7b8c9d0e1
Connecting to:          mongodb://127.0.0.1:27017/
Using MongoDB:          8.0.0
Using Mongosh:          2.3.0

test>

test> — bu prompt. Hozir test database ichida turibsiz.


mongosh navigatsiyasi

mongosh prompt:   test>
                   ↑
              joriy database

Asosiy navigatsiya buyruqlari:

// Barcha databaselarni ko'rish
show dbs

// Natija:
// admin    40 kB
// local    72 kB
// maktab    8 kB

// Database tanlash (yoki yaratish)
use maktab
// maktab>

// Joriy database
db
// maktab

// Barcha collectionlarni ko'rish
show collections
// talabalar
// o_qituvchilar

mongosh da buyruqlar ko'rinishi

Bir amaliy seansni ko'raylik. Bosqichma-bosqich nima bo'layotgani ko'rsatilgan:

test> use maktab
maktab>
        ↑ database o'zgardi

maktab> db.talabalar.insertOne({ ism: "Jasur", yosh: 24, shahar: "Toshkent" })
{
  acknowledged: true,
  insertedId: ObjectId('64a1f2c3b4e5f6a7b8c9d0e1')
              ↑ MongoDB avtomatik ID yaratdi
}

maktab> db.talabalar.insertOne({ ism: "Malika", yosh: 22, shahar: "Samarqand" })
{
  acknowledged: true,
  insertedId: ObjectId('64a1f2c3b4e5f6a7b8c9d0e2')
}

maktab> db.talabalar.find()
[
  {
    _id: ObjectId('64a1f2c3b4e5f6a7b8c9d0e1'),
    ism: 'Jasur',
    yosh: 24,
    shahar: 'Toshkent'
  },
  {
    _id: ObjectId('64a1f2c3b4e5f6a7b8c9d0e2'),
    ism: 'Malika',
    yosh: 22,
    shahar: 'Samarqand'
  }
]

mongosh buyruqlar — cheat sheet

┌─────────────────────────────────────────────────────────────┐
│  NAVIGATSIYA                                                │
├─────────────────────────┬───────────────────────────────── │
│  show dbs               │  Barcha databaselar             │
│  use <db>               │  Database tanlash               │
│  db                     │  Joriy database nomi            │
│  show collections       │  Joriy db dagi collectionlar    │
│  db.stats()             │  DB statistikasi                │
├─────────────────────────┼───────────────────────────────── │
│  COLLECTION              │                                 │
├─────────────────────────┼───────────────────────────────── │
│  db.col.find()          │  Hammani ko'rish                │
│  db.col.find({...})     │  Filter bilan                   │
│  db.col.findOne({...})  │  Birinchi topilganni            │
│  db.col.countDocuments()│  Soni                           │
│  db.col.insertOne({})   │  Bitta qo'shish                 │
│  db.col.insertMany([])  │  Ko'p qo'shish                  │
│  db.col.updateOne()     │  Bitta yangilash                │
│  db.col.deleteOne()     │  Bitta o'chirish                │
│  db.col.drop()          │  Collection ni o'chirish        │
├─────────────────────────┼───────────────────────────────── │
│  DATABASE                │                                 │
├─────────────────────────┼───────────────────────────────── │
│  db.dropDatabase()      │  Databaseni o'chirish           │
├─────────────────────────┼───────────────────────────────── │
│  YORDAMCHI              │                                  │
├─────────────────────────┼───────────────────────────────── │
│  exit  yoki  Ctrl+C     │  Chiqish                        │
│  cls                    │  Ekranni tozalash               │
│  ↑ ↓ (strelka)          │  Oldingi buyruqlar tarixi       │
│  Tab                    │  Avtoto'ldirish                 │
└─────────────────────────┴───────────────────────────────── │

Tab avtoto'ldirish — foydali xususiyat

mongosh da Tab bosish — kodni yakunlab beradi:

maktab> db.tal[Tab]
maktab> db.talabalar

maktab> db.talabalar.f[Tab]
find()   findOne()   findOneAndDelete()   findOneAndReplace() ...

maktab> db.talabalar.find[Tab]
maktab> db.talabalar.find()

To'g'ri yozishni esda saqlash shart emas — Tab yordam beradi.


mongosh — ko'p qatorli kod

Katta JSON yozishda mongosh avtomatik aniqlaydi — qavslar yopilmagan bo'lsa, yangi qator kutadi:

maktab> db.talabalar.insertOne({
...   ism: "Bobur",
...   yosh: 26,
...   manzil: {
...     shahar: "Toshkent",
...     tuman: "Yunusobod"
...   }
... })

... — mongosh davom etishingizni kutayapti. Oxirgi }) yopilgach bajaradi.


.find() natijasini chiroyli ko'rsatish

Ko'p document bo'lsa, chiqish qisqartiriladi. Barchasini ko'rish:

// Standart — ba'zi documentlar ... bilan qisqartirilishi mumkin
db.talabalar.find()

// Barchasini ko'rish — forEach bilan
db.talabalar.find().forEach(doc => printjson(doc))

Compass vs mongosh — qachon nima ishlatish

┌────────────────────┬────────────────────────────────────────┐
│  Vazifa            │  Tavsiya                               │
├────────────────────┼────────────────────────────────────────┤
│  Ma'lumot ko'rish  │  Compass — vizual, qulay               │
│  Schema tekshirish │  Compass — Schema tab                  │
│  Index ko'rish     │  Compass — Indexes tab                 │
│  Pipeline sinash   │  Compass — Aggregations tab            │
│  Tez query         │  mongosh — tez, to'g'ridan-to'g'ri     │
│  Script yozish     │  mongosh — .js fayl ishlatish mumkin   │
│  Server da ishlash │  mongosh — GUI yo'q, faqat terminal    │
│  Avtomatlashtirish │  mongosh — bash + cron bilan           │
└────────────────────┴────────────────────────────────────────┘

Real hayotda: Compass da ma'lumotni ko'rasiz, tuzilishni tushunasiz, so'ngra mongosh yoki Mongoose da yozasiz.


Amaliy mashq — birgalikda bajaraylik

Bu qadamlarni o'zingiz bajaring. Har qadam tekshiriladigan natija beradi.

Qadam 1 — database va ma'lumotlar yaratish

use maktab

db.talabalar.insertMany([
  { ism: "Jasur",  yosh: 24, shahar: "Toshkent",  fan: "Matematika" },
  { ism: "Malika", yosh: 22, shahar: "Samarqand", fan: "Biologiya"  },
  { ism: "Bobur",  yosh: 25, shahar: "Toshkent",  fan: "Fizika"     },
  { ism: "Zulfiya",yosh: 21, shahar: "Namangan",  fan: "Kimyo"      },
  { ism: "Sardor", yosh: 23, shahar: "Toshkent",  fan: "Matematika" }
])

Natija:

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('...'),
    '1': ObjectId('...'),
    ...
  }
}

Qadam 2 — ko'rish

// Barchasi
db.talabalar.find()

// Faqat Toshkentliklar
db.talabalar.find({ shahar: "Toshkent" })

// Natija:
// Jasur, Bobur, Sardor — 3 ta document

Qadam 3 — sanaymiz

db.talabalar.countDocuments()
// 5

db.talabalar.countDocuments({ shahar: "Toshkent" })
// 3

Qadam 4 — Compass da ko'rish

Compass ni oching → maktab → talabalar → Documents tab. Siz qo'shgan 5 ta document ko'rinadi.

Filter ga { shahar: "Toshkent" } yozing → Find bosing → faqat Toshkentliklar qoladi.


Tez-tez uchraydigan xatolar

mongosh ulanmaydi — "MongoNetworkError"

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017

MongoDB service ishlamayapti. Avval uni ishga tushiring:

# Linux
sudo systemctl start mongod

# Mac
brew services start mongodb-community

# Docker
docker start mongodb

Sabab: mongosh server bilan gaplashadi. Server to'xtagan bo'lsa, gaplashadigan hech kim yo'q — ulanish rad etiladi.

"use maktab" deb database yaratdim, lekin "show dbs" da ko'rinmaydi

MongoDB bo'sh databaseni ro'yxatga qo'shmaydi. Kamida bitta document qo'shilgach, database show dbs da paydo bo'ladi.

use maktab
show dbs         // maktab ko'rinmaydi — bo'sh

db.test.insertOne({ a: 1 })
show dbs         // maktab endi ko'rinadi

Compass da "Authentication failed"

Docker yoki Atlas da parol bilan o'rnatilgan bo'lsa, URI ga foydalanuvchi va parol qo'shing:

mongodb://admin:maxfiysoz@localhost:27017

mongosh da .find() faqat 20 ta document ko'rsatadi

Bu normaldir — mongosh 20 tadan ko'p natijani to'g'ridan-to'g'ri bosmaslik uchun chegaralaydi. Davomini ko'rish:

db.talabalar.find()
// ... 20 ta ...
// Type "it" for more

it   // ← keyingi 20 ta

Yoki hammasini bir yo'la:

db.talabalar.find().toArray()

Xulosa

  • Compass — vizual interfeys: ko'rish, filter, schema tahlil, pipeline sinash
  • mongosh — terminal: tez query, scripting, server da ishlash
  • Ikkalasi bir-birini to'ldiradi — Compass tushunish uchun, mongosh ishlash uchun
  • use <db> — database tanlash; show collections — collectionlar
  • .find() — ko'rish; .insertOne() — qo'shish; .countDocuments() — sanash
  • Bo'sh database show dbs da ko'rinmaydi — document qo'shilgach paydo bo'ladi

Keyingi dars: 4-dars — Database, Collection, Document: tuzilishi, BSON nima