MongoDB’de Detaylı Sorgulama/Querying (MongoDB Öğreniyoruz 4)

Murat Çabuk
6 min readAug 8, 2022

Merhaba arkadaşlar

Yazı serimizin bu yazısında crud işlemlerini gördüğümüz makalenin devamı niteliğinde olan ve sorgulama detaylarını içeren konuları göreceğiz.

Makale serisinin diğer yazıları için alttaki linkleri kullanabilirsiniz.

Array Sorgulama

Şu sayfayı takip ediyor olacağız. Sayfadaki shell’i de kullanarak da uygulamaları yapabilirsiniz.

Öncelikle kayıtlarımızı girelim. Göreceğiniz üzere tags alanı array tipinde.

db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);
  • Eşitlik Sorgulamak

Tag alanın eşit olması gereken array ifadesi olduğu gibi yazarak arama yapabiliriz.

db.inventory.find( { tags: ["red", "blank"] } )
// [
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934d"),
// item: 'notebook',
// qty: 50,
// tags: [ 'red', 'blank' ],
// dim_cm: [ 14, 21 ]
// }
// ]

Eğer red ve ardından blank değerini aynı sırada değilde farklı sırada bile olsa almak istersek $all operatörünü kullanırız.

$all operatörünün detayları için şu sayfayı ziyaret ediniz.

db.inventory.find( { tags: { $all: ["red", "blank"] } } )// [
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934c"),
// item: 'journal',
// qty: 25,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934d"),
// item: 'notebook',
// qty: 50,
// tags: [ 'red', 'blank' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934e"),
// item: 'paper',
// qty: 100,
// tags: [ 'red', 'blank', 'plain' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934f"),
// item: 'planner',
// qty: 75,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 22.85, 30 ]
// }
// ]
  • Array İçindeki Değerleri Sorgulama
db.inventory.find( { tags: "red" } )
// [
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934c"),
// item: 'journal',
// qty: 25,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934d"),
// item: 'notebook',
// qty: 50,
// tags: [ 'red', 'blank' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934e"),
// item: 'paper',
// qty: 100,
// tags: [ 'red', 'blank', 'plain' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934f"),
// item: 'planner',
// qty: 75,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 22.85, 30 ]
// }
// ]
  • Array İçinde Birden Fazla Koşul Kullanmak

Bunun için $selemMatch operatörünü kullanıyoruz. $elemMatch içinde $gt ve $lt operatörleri aynı anda kullanılmış.

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )// [
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934f"),
// item: 'planner',
// qty: 75,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 22.85, 30 ]
// }
// ]
  • Array’in Boyutunu Sorgulamak
db.inventory.find( { "tags": { $size: 3 } } )// [
// {
// _id: ObjectId("62cff0df6d23d2ccaad2934e"),
// item: 'paper',
// qty: 100,
// tags: [ 'red', 'blank', 'plain' ],
// dim_cm: [ 14, 21 ]
// }
// ]

Null, Missing Value ve Type Sorgulama

Konuyu şu sayfadan takip edebilirsiniz.

Önce kayıt girelim.

db.inventory.insertMany([
{ _id: 1, item: null },
{ _id: 2 }
])
  • Null Sorgulama

Dikkat edilirse null sorgusunda hem null hem de missing value geliyor.

db.inventory.find( { item: null } )// [ { _id: 1, item: null }, { _id: 2 } ]
  • Type Check

10 rakamı null tipinin sayısal değeri. Bütün BSON tiplerini görmek için şu sayfayı ziyaret ediniz. Sadece tek değer döndü çünkü biz burada değer kontrolü değil tip sorgulaması yaptık.

db.inventory.find( { item : { $type: 10 } } )// [ { _id: 1, item: null } ]
  • Alanın Varolup Olmadığını Sorgulanması
db.inventory.find( { item : { $exists: false } } )// [ { _id: 2 } ]

And, Or kullanımı ve İçiçe Sorgular

Konuyu şu linkten takip edebilirsiniz.

Öncelikle biraz kayıt girelim.

db.inventory2.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "notebook2", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ], "price": 10.5 },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] , "price": 10.5 },
{ item: "paper2", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] , "price": 10.5 },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ], "price": 11.0 },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ], "price": 12.5 }
]);

Syntax’i şu şekilde

{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

And kullanımı

db.inventory2.find( 
{
$and:
[
{qty: { $in: [100,75, 25] } },
{price: { $exists: true } }
]
}
)
// price ı olup qty alanın değeri 100, 75, 25 den biri olanlar// [
// {
// _id: ObjectId("62d1a4453d35a3afc00610b0"),
// item: 'paper',
// qty: 100,
// tags: [ 'red', 'blank', 'plain' ],
// dim_cm: [ 14, 21 ],
// price: 10.5
// },
// {
// _id: ObjectId("62d1a4453d35a3afc00610b1"),
// item: 'paper2',
// qty: 100,
// tags: [ 'red', 'blank', 'plain' ],
// dim_cm: [ 14, 21 ],
// price: 10.5
// },
// {
// _id: ObjectId("62d1a4453d35a3afc00610b2"),
// item: 'planner',
// qty: 75,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 22.85, 30 ],
// price: 11
// }
// ]

Or Kullanımı

db.inventory2.find( 
{
$or:
[
{qty: { $in: [75,25] } },
{item: "postcard" }
]
}
)
// qty alanın değeri 75, 25 den biri olanlar veya item alanı postcard olanlar// [
// {
// _id: ObjectId("62d1a4453d35a3afc00610ad"),
// item: 'journal',
// qty: 25,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 14, 21 ]
// },
// {
// _id: ObjectId("62d1a4453d35a3afc00610b2"),
// item: 'planner',
// qty: 75,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 22.85, 30 ],
// price: 11
// },
// {
// _id: ObjectId("62d1a4453d35a3afc00610b3"),
// item: 'postcard',
// qty: 45,
// tags: [ 'blue' ],
// dim_cm: [ 10, 15.25 ],
// price: 12.5
// }
// ]

Şimdi içiçe yazmayı deneyelim.

db.inventory2.find( 
{
$and:[
{ qty: { $in: [75, 25] } },
{ $or:
[
{ item: "postcard" },
{ item: "journal" }
]
}
]
}
)
// qty alanı 75 veya 25 den biri olan ve item değeri postcard veya journal olan// [
// {
// _id: ObjectId("62d1a4453d35a3afc00610ad"),
// item: 'journal',
// qty: 25,
// tags: [ 'blank', 'red' ],
// dim_cm: [ 14, 21 ]
// }
// ]

Sayfalama

Normalde eğer yaptığımız sorgunun sonunda aşağıdaki örnekte olduğu gibi array fonksiyonu eklemezsek sadece ilk yirmi doküman gelir. Shell üzerinde ilk yirmi kayıttan sonra it komutu ile sonraki yirmi kayıt görülebilir.

db.collection.find({}).array()

Uygulama yazarken veya shell ekranında da kullanabileceğimiz aşağıdaki tekniklerle istediğimiz kadar kaydı istediğimiz noktadan itibaren alabiliriz.

// Sayfa 1
db.items.find().limit(10)
// veya
db.items.find({}, { limit: 10 })
// Sayfa 2
db.items.find().skip(10).limit(10)
// veya
db.items.find({}, { limit: 10, skip: 10 })
// Sayfa 3
db.items.find().skip(10).limit(10)
// veya
db.items.find({}, { limit: 10, skip: 10 })

Umarım faydalı olmuştur.

Makale serisinin diğer yazıları için alttaki linkleri kullanabilirsiniz.

Kaynaklar

Originally published at https://github.com.

--

--