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:

  1. $lt bilan 30 000 dan arzon mahsulotlarni toping.
  2. $gte va $lte ni bitta obyektda yozib, 5000–50000 oralig’idagi mahsulotlarni chiqaring.
  3. Xuddi shu oraliqni ikki marta price yozib sinang va natija nega boshqacha chiqqanini tushuntiring.
  4. $in bilan ["kitob", "kanselyariya"] kategoriyalarini toping, so’ng $nin bilan teskarisini oling.
  5. $ne bilan quantity si 0 ga teng bo’lmagan mahsulotlarni qidiring va natijada quantity maydoni yo’q hujjat bor-yo’qligini tekshiring.
  6. $exists: false bilan rating maydoni 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.
  • $in va $nin bir maydonning bir necha qiymatini tekshiradi.
  • $ne maydoni umuman yo’q hujjatlarni ham qaytaradi — kerak bo’lsa $exists bilan birga yozing.
  • $exists maydon borligini, null esa maydon bor-u qiymati bo’shligini bildiradi.
  • $type bilan noto’g’ri turda yozilgan qiymatlarni topish mumkin.

Keyingi darsda mantiqiy operatorlar$and, $or va $not bilan murakkab shartlar.

Bu dars foydali bo'ldimi?

marta ko'rildi