MongoDB'de belge silmek için önce silinecek kayıtları belirleyen bir filtre hazırlarsın. Ardından bu filtreyi, tek belge silmek için deleteOne() metoduna, eşleşen belgeleri topluca silmek için deleteMany() metoduna verirsin. İşlem sonucundaki deletedCount alanı, kaç belgenin silindiğini gösterir.
deleteOne ve deleteMany arasındaki fark nedir?
deleteOne(), filtreye uyan en fazla bir belgeyi siler; deleteMany() ise filtreye uyan tüm belgeleri silmeyi hedefler. Hiçbir belge eşleşmezse silinen belge sayısı sıfır olur.
MongoDB'de koleksiyon, belgelerin bulunduğu yapıdır. Belge, alan ve değerlerden oluşan bir kayıttır; kitap adı ile stok bilgisini birlikte tutan bir kayıt buna örnektir. Filtre ise hangi belgelerin seçileceğini belirleyen koşulları içerir.
Silme filtresini, find() sorgusunda kullandığın filtreyle aynı yapıda yazabilirsin. Örneğin { stok: 0 }, stok alanı sıfır olan belgeleri seçer. Bu filtreyi deleteOne() ile kullanırsan eşleşenlerden en fazla biri, deleteMany() ile kullanırsan eşleşenlerin tamamı silinmek üzere hedeflenir.
Birden fazla belge aynı filtreye uyuyorsa deleteOne() işleminin belirli bir kitabı seçeceğini varsayma. Belirli bir belgeyi hedeflemek için koleksiyonda benzersiz olan _id alanı gibi bir ölçüt kullanabilirsin.
Örnek koleksiyon ve belgeler nasıl hazırlanır?

Örneği hazırlamak için mongosh içinde önce kutuphane veritabanına geç, ardından kitaplar koleksiyonuna belgeleri ekle. Komutları mevcut verilerini etkilememek için örneğe ayrılmış bir ortamda çalıştır.
İlk komut, sonraki işlemlerde kullanılacak veritabanını seçer:
use kutuphane
Beklenen çıktı:
switched to db kutuphane
Şimdi insertMany() ile üç kitap ekle. Her belgenin _id değeri açıkça belirlenmiştir; böylece sonraki silme örneklerinde aynı kimlikleri kullanabilirsin.
db.kitaplar.insertMany([
{
_id: ObjectId("64a000000000000000000001"),
ad: "Algoritma Temelleri",
stok: 5
},
{
_id: ObjectId("64a000000000000000000002"),
ad: "Veri Yapılarına Giriş",
stok: 0
},
{
_id: ObjectId("64a000000000000000000003"),
ad: "Veritabanı Kavramları",
stok: 0
}
])
ObjectId(...), verilen kimlik değerini MongoDB'nin ObjectId türünde oluşturur. Burada iki kitabın stok değeri sıfırdır; bu durum, sonraki bölümlerde çoklu silme filtresini denemek için kullanılabilir.
Ekleme başarılı olduğunda beklenen sonuç şöyledir:
{
acknowledged: true,
insertedIds: {
'0': ObjectId('64a000000000000000000001'),
'1': ObjectId('64a000000000000000000002'),
'2': ObjectId('64a000000000000000000003')
}
}
acknowledged alanı işlemin onaylandığını, insertedIds ise eklenen belgelerin kimliklerini gösterir. Aynı kimlikler koleksiyonda zaten varsa ekleme yinelendiğinde benzersiz _id alanı nedeniyle hata oluşur.
deleteOne ile _id üzerinden tek belge nasıl silinir?

deleteOne metoduna silmek istediğin belgenin _id değerini içeren bir filtre vererek tek bir kitabı silebilirsin. Silmeden önce aynı filtreyi find ile çalıştırmak, seçilen belgeyi kontrol etmene yardımcı olur.
Aşağıdaki örnekte kitaplar koleksiyonunda, belirtilen ObjectId değerine sahip ve stok sayısı 3 olan bir “Algoritma Temelleri” belgesi bulunduğu varsayılır. Kendi koleksiyonunda çalışırken çıktıda gördüğün gerçek _id değerini kullanmalısın.
db.kitaplar.find({
_id: ObjectId("65a000000000000000000001")
})
Örnek belgenin çıktısı şöyle görünür:
[
{
_id: ObjectId("65a000000000000000000001"),
ad: 'Algoritma Temelleri',
stok: 3
}
]
Belgeyi kontrol ettikten sonra aynı filtreyle silme işlemini çalıştırabilirsin:
db.kitaplar.deleteOne({
_id: ObjectId("65a000000000000000000001")
})
İşlem onaylandığında ve belge silindiğinde beklenen sonuç şöyledir:
{ acknowledged: true, deletedCount: 1 }
deletedCount, silinen belge sayısını gösterir. Filtreyle eşleşen bir belge yoksa başarılı bir işlemde bu değer 0 olur.
Belgenin _id alanı ObjectId türündeyse filtrede de bu türü kullanmalısın. Aynı karakterleri içeren düz metin, farklı bir veri türü olduğu için o ObjectId değeriyle eşleşmez.
deleteMany ile stokta olmayan kitaplar nasıl silinir?
deleteMany, verdiğin filtreye uyan kitap belgelerini siler. Stok değeri sıfır olan belgeleri hedeflemek için { stok: 0 } filtresini kullanabilirsin.
Bu örnekte, önceki silme işleminden sonra koleksiyonda stok değeri sıfır olan iki kitap ve stokta bulunan bir kitap kaldığını varsayalım. Önce silme filtresine uyan belgelerin sayısını kontrol et:
db.kitaplar.countDocuments({ stok: 0 })
Bu verilerle beklenen çıktı 2 olur. countDocuments, filtreye uyan belgelerin sayısını döndürür; belgelerin içeriklerini incelemek için aynı filtreyi find ile de çalıştırabilirsin.
Ardından aynı filtreyi silme işlemine ver:
db.kitaplar.deleteMany({ stok: 0 })
İki belge silindiğinde beklenen sonuç şöyledir:
{ acknowledged: true, deletedCount: 2 }
Buradaki deletedCount: 2, işlemin iki belge sildiğini gösterir. Kontrol ile silme arasında koleksiyon değişirse gerçek silme sayısı önceden saydığın değerden farklı olabilir.
Kalan belgeleri görmek için filtre vermeden find çalıştır:
db.kitaplar.find()
Stokta bulunan tek kitap “Veri Yapıları” ise örnek çıktı şöyle olabilir:
[
{
_id: ObjectId("65a000000000000000000004"),
ad: 'Veri Yapıları',
stok: 5
}
]
Boş filtreye dikkat: deleteMany içinde {} kullanmak koleksiyondaki tüm belgeleri hedefler. Bu nedenle komutu çalıştırmadan önce filtrenin amaçladığın koşulu içerdiğini kontrol etmelisin.
Silmeden önce hangi güvenlik kontrolleri yapılmalı?
Silme işleminden önce doğru veri tabanını ve koleksiyonu seçtiğini doğrula, ardından filtrenin hangi belgelerle eşleştiğini incele. Özellikle birden fazla belge silerken aşağıdaki kontroller yanlış kapsamda işlem yapma riskini azaltabilir.
- Filtreyi gözden geçir: Aynı filtreyle önce
find()çalıştırarak belgeleri incele, ardındancountDocuments()ile eşleşen belge sayısını kontrol et. - Boş filtreye dikkat et:
deleteMany({}), koleksiyondaki tüm belgeleri silmeyi hedefler. Tüm belgeleri silmek istemiyorsan filtrenin yanlışlıkla boş kalmadığından emin ol. - Yedek al: Üretim verisini silmeden önce uygun bir yedek oluştur ve geri yükleme sürecinin nasıl işleyeceğini kontrol et.
- Kullanıcı girdisini doğrula: Kullanıcıdan gelen nesneyi doğrudan filtre olarak kullanma. Beklenen veri türünü ve değeri doğrula, sorgu filtresini uygulama içinde oluştur.
Örneğin aşağıdaki sorgular, stok değeri sıfır olan kitapları silmeden önce incelemene yardımcı olur:
db.kitaplar.find({ stok: 0 })
db.kitaplar.countDocuments({ stok: 0 })
İlk sorgu eşleşen belgeleri gösterir; ikinci sorgu sayı döndürür. Örneğin bu koşulu sağlayan iki belge varsa sayma işleminin çıktısı 2 olur. Bu sorgular veri silmez; ayrıca kontrol ile silme arasında veriler değişebileceğinden sonuçları değerlendirirken bu olasılığı da hesaba kat.
Kullanıcı girdisinin beklenen türde olması önemlidir; aksi hâlde filtreye sorgu operatörü içeren bir nesne geçebilir. MongoDB, kullanıcıdan gelen değerlerle eşitlik sorgusu oluştururken açık $eq kullanımını önerir.
Silinen belgelerin kendiliğinden geri alınacağını varsayma. Geri yükleme, silinmeden önce alınmış uygun bir yedeğin bulunmasına ve ortama uygun kurtarma sürecinin uygulanmasına bağlıdır.
Filtreyi önceden incelemek ve kurtarma hazırlığını yapmak, silme komutunu çalıştırmadan önce kapsamı daha güvenli değerlendirmeni sağlar.