MongoDB solishtirish operatorlari
Oldingi darsda filtr aynan tenglikni tekshirardi:
{ price: 45000 } — narxi shuncha bo’lgan hujjatlar. Lekin amaliy
savollar boshqacha qo’yiladi: “50 mingdan arzon mahsulotlar”, “omborda
10 tadan kam qolganlari”.
Buning uchun MongoDB’da operatorlar bor — $ belgisi bilan
boshlanadigan maxsus kalitlar.
Misollar uchun baza:
use shop
db.products.drop()
db.products.insertMany([
{ name: "O'tkan kunlar", category: "kitob", price: 45000, quantity: 12, rating: 4.8 },
{ name: "Mehrobdan chayon", category: "kitob", price: 38000, quantity: 7, rating: 4.5 },
{ name: "Shum bola", category: "kitob", price: 29000, quantity: 0, rating: 4.9 },
{ name: "Daftar", category: "kanselyariya", price: 8000, quantity: 150 },
{ name: "Ruchka", category: "kanselyariya", price: 4000, quantity: 300 },
{ name: "Quloqchin", category: "texnika", price: 320000, quantity: 5, rating: 4.2 }
])
{
acknowledged: true,
insertedIds: {
'0': ObjectId('671f6a1b2c3d4e5f6a7b8c11'),
'1': ObjectId('671f6a1b2c3d4e5f6a7b8c12'),
'2': ObjectId('671f6a1b2c3d4e5f6a7b8c13'),
'3': ObjectId('671f6a1b2c3d4e5f6a7b8c14'),
'4': ObjectId('671f6a1b2c3d4e5f6a7b8c15'),
'5': ObjectId('671f6a1b2c3d4e5f6a7b8c16')
}
}
Daftar va Ruchka hujjatlarida rating yo’q — bu ataylab, oxirida
kerak bo’ladi.
Operator yozilishi
Oddiy filtr va operatorli filtr shakli bilan farq qiladi:
// Tenglik — qiymat to'g'ridan-to'g'ri
{ price: 45000 }
// Operator — qiymat o'rnida obyekt
{ price: { $gt: 45000 } }
$gt va $lt — kattaroq va kichikroq
db.products.find({ price: { $lt: 40000 } }, { name: 1, price: 1, _id: 0 })
[
{ name: 'Mehrobdan chayon', price: 38000 },
{ name: 'Shum bola', price: 29000 },
{ name: 'Daftar', price: 8000 },
{ name: 'Ruchka', price: 4000 }
]
To’rtta solishtirish operatori bor:
| Operator | Ma’nosi | SQL muqobili |
|---|---|---|
$gt |
kattaroq (greater than) | > |
$gte |
katta yoki teng | >= |
$lt |
kichikroq (less than) | < |
$lte |
kichik yoki teng | <= |
db.products.find({ quantity: { $gte: 100 } }, { name: 1, quantity: 1, _id: 0 })
[
{ name: 'Daftar', quantity: 150 },
{ name: 'Ruchka', quantity: 300 }
]
Oraliq — bitta maydonda ikki operator
Ikki shartni bitta obyektga qo’yish mumkin:
db.products.find(
{ price: { $gte: 20000, $lte: 50000 } },
{ name: 1, price: 1, _id: 0 }
)
[
{ name: "O'tkan kunlar", price: 45000 },
{ name: 'Mehrobdan chayon', price: 38000 },
{ name: 'Shum bola', price: 29000 }
]
Bu SQL BETWEEN ning MongoDB’dagi shakli.
$in va $nin — ro’yxatga tegishlilik
Bir necha qiymatdan birortasi mos kelsa yetarli bo’lsa:
db.products.find(
{ category: { $in: ["kitob", "texnika"] } },
{ name: 1, category: 1, _id: 0 }
)
[
{ name: "O'tkan kunlar", category: 'kitob' },
{ name: 'Mehrobdan chayon', category: 'kitob' },
{ name: 'Shum bola', category: 'kitob' },
{ name: 'Quloqchin', category: 'texnika' }
]
$nin (not in) teskarisini beradi:
db.products.find(
{ category: { $nin: ["kitob", "texnika"] } },
{ name: 1, category: 1, _id: 0 }
)
[
{ name: 'Daftar', category: 'kanselyariya' },
{ name: 'Ruchka', category: 'kanselyariya' }
]
$eq va $ne — tenglik va uning inkori
$eq aniq tenglikni bildiradi. { price: 45000 } va
{ price: { $eq: 45000 } } bir xil ishlaydi, shuning uchun qisqasi
ishlatiladi.
$ne (not equal) esa kerakli vosita:
db.products.find(
{ category: { $ne: "kanselyariya" } },
{ name: 1, category: 1, _id: 0 }
)
[
{ name: "O'tkan kunlar", category: 'kitob' },
{ name: 'Mehrobdan chayon', category: 'kitob' },
{ name: 'Shum bola', category: 'kitob' },
{ name: 'Quloqchin', category: 'texnika' }
]
$exists — maydon bormi
db.products.find({ rating: { $exists: true } }, { name: 1, rating: 1, _id: 0 })
[
{ name: "O'tkan kunlar", rating: 4.8 },
{ name: 'Mehrobdan chayon', rating: 4.5 },
{ name: 'Shum bola', rating: 4.9 },
{ name: 'Quloqchin', rating: 4.2 }
]
Maydoni yo’qlarini topish:
db.products.find({ rating: { $exists: false } }, { name: 1, _id: 0 })
[ { name: 'Daftar' }, { name: 'Ruchka' } ]
Endi yuqoridagi tuzoqni tuzatamiz — ikki shartni birlashtiramiz:
db.products.find(
{ rating: { $exists: true, $ne: 4.2 } },
{ name: 1, rating: 1, _id: 0 }
)
[
{ name: "O'tkan kunlar", rating: 4.8 },
{ name: 'Mehrobdan chayon', rating: 4.5 },
{ name: 'Shum bola', rating: 4.9 }
]
Endi natija kutilganidek.
$exists va null farqi
Ikki holat bor va ular boshqa-boshqa:
| Hujjat | $exists: true |
$eq: null |
|---|---|---|
{ name: "A", rating: 4.5 } |
Mos | Mos emas |
{ name: "B", rating: null } |
Mos | Mos |
{ name: "C" } |
Mos emas | Mos |
Ya’ni rating: null — maydon bor, qiymati bo’sh. Uchinchi holatda
maydon umuman yo’q.
db.products.insertOne({ name: "Sinov", category: "test", rating: null })
db.products.find({ rating: { $exists: true } }, { name: 1, rating: 1, _id: 0 })
[
{ name: "O'tkan kunlar", rating: 4.8 },
{ name: 'Mehrobdan chayon', rating: 4.5 },
{ name: 'Shum bola', rating: 4.9 },
{ name: 'Quloqchin', rating: 4.2 },
{ name: 'Sinov', rating: null }
]
$type — qiymat turini tekshirish
Schema-siz bazada bir maydon turli turda bo’lib qolishi mumkin. Buni topish uchun:
db.products.insertOne({ name: "Xato yozuv", category: "test", price: "50000" })
db.products.find({ price: { $type: "string" } }, { name: 1, price: 1, _id: 0 })
[ { name: 'Xato yozuv', price: '50000' } ]
Narx matn sifatida yozilgan hujjat topildi. Bunday hujjat
{ price: { $lt: 60000 } } filtriga tushmaydi — MongoDB matn va
sonni bir-biri bilan solishtirmaydi.
Amaliy mashq
Yuqoridagi shop bazasida bajaring:
$ltbilan 30 000 dan arzon mahsulotlarni toping.$gteva$lteni bitta obyektda yozib, 5000–50000 oralig’idagi mahsulotlarni chiqaring.- Xuddi shu oraliqni ikki marta
priceyozib sinang va natija nega boshqacha chiqqanini tushuntiring. $inbilan["kitob", "kanselyariya"]kategoriyalarini toping, so’ng$ninbilan teskarisini oling.$nebilanquantitysi0ga teng bo’lmagan mahsulotlarni qidiring va natijadaquantitymaydoni yo’q hujjat bor-yo’qligini tekshiring.$exists: falsebilanratingmaydoni yo’q hujjatlarni sanang.
3-qadam eng ko’p vaqt yeydigan xatoni ko’rsatadi: filtr xato bermay noto’g’ri ishlashi mumkin.
Qisqacha xulosa
- Operator
$bilan boshlanadi va maydon qiymati o’rnidagi obyekt ichida yoziladi. $gt,$gte,$lt,$lte— sonli va sanali solishtirish.- Oraliq bitta obyektda yoziladi; maydon nomini ikki marta yozish birinchi shartni yo’qotadi.
$inva$ninbir maydonning bir necha qiymatini tekshiradi.$nemaydoni umuman yo’q hujjatlarni ham qaytaradi — kerak bo’lsa$existsbilan birga yozing.$existsmaydon borligini,nullesa maydon bor-u qiymati bo’shligini bildiradi.$typebilan noto’g’ri turda yozilgan qiymatlarni topish mumkin.
Keyingi darsda mantiqiy operatorlar —
$and, $or va $not bilan murakkab shartlar.