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:
find()bilan barcha mahsulotlarni chiqaring va nechtaligini sanang.category: "kanselyariya"filtri bilan qidiring, so’ng ungainStock: trueshartini qo’shib natijaning o’zgarishini kuzating.- Bir xil filtr bilan
findvafindOneni chaqirib, qaytgan turlarni solishtiring — biri qavs ichida, ikkinchisi yo’q. - Mavjud bo’lmagan kategoriya bo’yicha
findOnechaqirib,nullnatijasini ko’ring va uniifbilan qamrang. { name: 1, price: 1, _id: 0 }proyeksiyasi bilan faqat ikki maydonni chiqaring.{ 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
findbo’sh massiv,findOneesanullberadi. - Filtr — oddiy obyekt; undagi maydonlar yashirin VA shartiga birlashadi.
- Ikkinchi argument — proyeksiya:
1kiritadi,0chiqaradi. - Bir proyeksiyada
1va0aralashmaydi,_id: 0dan tashqari. _idbo’yicha qidirganda qiymatObjectId('...')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.