MongoDB hujjat o'qish: find va findOne

Baza to’ldi, endi undan kerakli hujjatni topish kerak. SQL SELECT darsida bu SELECT ... WHERE ... edi. MongoDB’da o’sha ish find() metodiga tushadi va shart oddiy obyekt sifatida beriladi.

Bu darsdagi misollar uchun bazani to’ldiramiz:

use shop
db.products.drop()
db.products.insertMany([
  { name: "O'tkan kunlar", category: "kitob", price: 45000, quantity: 12, inStock: true },
  { name: "Mehrobdan chayon", category: "kitob", price: 38000, quantity: 7, inStock: true },
  { name: "Shum bola", category: "kitob", price: 29000, quantity: 0, inStock: false },
  { name: "Daftar", category: "kanselyariya", price: 8000, quantity: 150, inStock: true },
  { name: "Ruchka", category: "kanselyariya", price: 4000, quantity: 300, inStock: true }
])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('671f5a1b2c3d4e5f6a7b8c01'),
    '1': ObjectId('671f5a1b2c3d4e5f6a7b8c02'),
    '2': ObjectId('671f5a1b2c3d4e5f6a7b8c03'),
    '3': ObjectId('671f5a1b2c3d4e5f6a7b8c04'),
    '4': ObjectId('671f5a1b2c3d4e5f6a7b8c05')
  }
}

find — hamma hujjatlar

Argumentsiz find() butun kolleksiyani qaytaradi:

db.products.find()
[
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c01'), name: "O'tkan kunlar", category: 'kitob', price: 45000, quantity: 12, inStock: true },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c02'), name: 'Mehrobdan chayon', category: 'kitob', price: 38000, quantity: 7, inStock: true },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c03'), name: 'Shum bola', category: 'kitob', price: 29000, quantity: 0, inStock: false },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c04'), name: 'Daftar', category: 'kanselyariya', price: 8000, quantity: 150, inStock: true },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c05'), name: 'Ruchka', category: 'kanselyariya', price: 4000, quantity: 300, inStock: true }
]

SQL’dagi SELECT * FROM products ning o’zi.

Filtr — shart obyekt sifatida beriladi

find() ga obyekt bersangiz, u shartga aylanadi:

db.products.find({ category: "kitob" })
[
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c01'), name: "O'tkan kunlar", category: 'kitob', price: 45000, quantity: 12, inStock: true },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c02'), name: 'Mehrobdan chayon', category: 'kitob', price: 38000, quantity: 7, inStock: true },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c03'), name: 'Shum bola', category: 'kitob', price: 29000, quantity: 0, inStock: false }
]

Ikki maydonli filtr — ikkalasi ham bajarilishi kerak:

db.products.find({ category: "kitob", inStock: true })
[
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c01'), name: "O'tkan kunlar", category: 'kitob', price: 45000, quantity: 12, inStock: true },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c02'), name: 'Mehrobdan chayon', category: 'kitob', price: 38000, quantity: 7, inStock: true }
]

Vergul bilan ajratilgan maydonlar — yashirin VA sharti. SQL WHERE darsidagi AND ning o’zi.

findOne — bitta hujjat

find har doim ro’yxat qaytaradi, findOne esa bitta obyekt:

db.products.findOne({ category: "kitob" })
{
  _id: ObjectId('671f5a1b2c3d4e5f6a7b8c01'),
  name: "O'tkan kunlar",
  category: 'kitob',
  price: 45000,
  quantity: 12,
  inStock: true
}

Kvadrat qavslar yo’q — bu massiv emas, hujjatning o’zi.

Metod Qaytaradi Hech nima topilmasa
find() Kursor (ro’yxat) Bo’sh ro’yxat []
findOne() Bitta hujjat null
db.products.findOne({ category: "mebel" })
null

findOne qaysi birini qaytaradi

Shartga uchta hujjat mos kelsa ham, findOne bittasini beradi. Qaysi birini — kafolatlanmaydi.

Amalda odatda kolleksiyadagi birinchi mos hujjat qaytadi, lekin bunga tayanmang: tartib aniq kerak bo’lsa, saralash ishlatiladi.

Aniq bitta hujjat kerak bo’lganda _id bo’yicha qidiring — u yagona:

db.products.findOne({ _id: ObjectId('671f5a1b2c3d4e5f6a7b8c04') })
{
  _id: ObjectId('671f5a1b2c3d4e5f6a7b8c04'),
  name: 'Daftar',
  category: 'kanselyariya',
  price: 8000,
  quantity: 150,
  inStock: true
}

Proyeksiya — kerakli maydonlarni tanlash

Hujjatda yigirma maydon bo’lsa-yu, sizga ikkitasi kerak bo’lsa, hammasini tortib kelish ortiqcha. find ning ikkinchi argumenti maydonlarni tanlaydi:

db.products.find({ category: "kitob" }, { name: 1, price: 1 })
[
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c01'), name: "O'tkan kunlar", price: 45000 },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c02'), name: 'Mehrobdan chayon', price: 38000 },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c03'), name: 'Shum bola', price: 29000 }
]

_id baribir qaytdi — u standart holda har doim kiritiladi. Kerak bo’lmasa, aniq o’chiring:

db.products.find({ category: "kitob" }, { name: 1, price: 1, _id: 0 })
[
  { name: "O'tkan kunlar", price: 45000 },
  { name: 'Mehrobdan chayon', price: 38000 },
  { name: 'Shum bola', price: 29000 }
]

Teskari yo’l ham bor — keraksizni chiqarib tashlash:

db.products.find({ category: "kanselyariya" }, { quantity: 0, inStock: 0 })
[
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c04'), name: 'Daftar', category: 'kanselyariya', price: 8000 },
  { _id: ObjectId('671f5a1b2c3d4e5f6a7b8c05'), name: 'Ruchka', category: 'kanselyariya', price: 4000 }
]

Ichma-ich maydon bo’yicha qidirish

Hujjat ichida obyekt bo’lsa, nuqtali yo’l bilan qidiriladi:

db.products.insertOne({
  name: "Quloqchin",
  category: "texnika",
  price: 320000,
  warranty: { months: 12, type: "rasmiy" }
})
{
  acknowledged: true,
  insertedId: ObjectId('671f5b7c3d4e5f6a7b8c9d06')
}
db.products.find({ "warranty.type": "rasmiy" }, { name: 1, _id: 0 })
[ { name: 'Quloqchin' } ]

Yo’l tirnoq ichida yozilgani muhim — buni hujjat va kolleksiya darsida ko’rgansiz.

Natijani sanash va chiroyli chiqarish

Hujjatlar soni:

db.products.countDocuments({ category: "kitob" })
3

mongosh uzun natijani qisqartirib ko’rsatishi mumkin. To’liq va tartibli ko’rinish uchun:

db.products.find({ category: "kitob" }).pretty()
[
  {
    _id: ObjectId('671f5a1b2c3d4e5f6a7b8c01'),
    name: "O'tkan kunlar",
    category: 'kitob',
    price: 45000,
    quantity: 12,
    inStock: true
  },
  ...
]

Amaliy mashq

Yuqoridagi shop bazasida bajaring:

  1. find() bilan barcha mahsulotlarni chiqaring va nechtaligini sanang.
  2. category: "kanselyariya" filtri bilan qidiring, so’ng unga inStock: true shartini qo’shib natijaning o’zgarishini kuzating.
  3. Bir xil filtr bilan find va findOne ni chaqirib, qaytgan turlarni solishtiring — biri qavs ichida, ikkinchisi yo’q.
  4. Mavjud bo’lmagan kategoriya bo’yicha findOne chaqirib, null natijasini ko’ring va uni if bilan qamrang.
  5. { name: 1, price: 1, _id: 0 } proyeksiyasi bilan faqat ikki maydonni chiqaring.
  6. { name: 1, price: 0 } ni ataylab yozib, chiqqan xato matnini o’qing.

4-qadam eng muhimi: null natijani tekshirmaslik — MongoDB bilan ishlashda eng ko’p uchraydigan yiqilish sababi.

Qisqacha xulosa

  • find() mos hujjatlar ro’yxatini, findOne() bitta hujjatni qaytaradi.
  • Hech nima topilmasa find bo’sh massiv, findOne esa null beradi.
  • Filtr — oddiy obyekt; undagi maydonlar yashirin VA shartiga birlashadi.
  • Ikkinchi argument — proyeksiya: 1 kiritadi, 0 chiqaradi.
  • Bir proyeksiyada 1 va 0 aralashmaydi, _id: 0 dan tashqari.
  • _id bo’yicha qidirganda qiymat ObjectId('...') bilan o’raladi, matn bermaydi.
  • Ichma-ich maydon "warranty.type" shaklida, tirnoq ichida yoziladi.

Keyingi darsda solishtirish operatorlari$gt, $lt, $in bilan oraliq va ro’yxat bo’yicha qidirish.

Bu dars foydali bo'ldimi?

marta ko'rildi