Ana içeriğe geç

MongoDB'de Birden Fazla Belgeyi Değiştirmek için updateMany() Nasıl Kullanılır

MongoDB'de updateMany() operatörünü tek bir işlemle birden fazla belgeyi güncellemek ve performansını optimize etmek için nasıl kullanacağınızı öğrenin.
· 4 dk. oku

Yapay Zeka ile Keşfedin

MongoDB söz konusu olduğunda, tek bir işlemle birden fazla belgeyi güncellemek isteyebileceğiniz senaryolar olabilir. Belgeler arasında dolaşıp her birini ayrı ayrı güncelleyebilirsiniz, ancak updateMany daha hızlı ve daha verimli bir çözüm sunar.

Bu kısa eğitimde, MongoDB'deki updateMany operatörünü nasıl kullanacağınızı ve en iyi performansı elde etmek için sorguları nasıl optimize edeceğinizi öğreneceğiz.

Python kullanarak MongoDB'nin veri işleme yeteneklerinde sağlam bir temel oluşturmak için Introduction to MongoDB in Python kursunu incelemeyi düşünebilirsiniz.

Birden Fazla MongoDB Belgesini Güncellemenin Pratik Bir Örneğine Bakalım

Bu kavramı açıklamak için, aynı anda birden fazla belgeyi güncellemek isteyebileceğiniz pratik bir örnek kullanalım.

Aşağıdaki verileri örneğimizin temeli olarak ele alalım:

[
    { "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
    { "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") },
    { "name": "Tony Kim", "title": "Alliance Czar", "salary": 80000, "last_raise_date": new Date("2025-02-01") },
];

Yukarıdaki JSON'da, hayali bir şirkette çalışan üç kişi var. Şirket, belirli bir süre boyunca maaş ayarlaması almamış olan herkese zam yapmak istiyor.

Uygun olan herkesin maaşını güncellemek için MongoDB'deki updateMany operatöründen yararlanabiliriz. Görevimizi yerine getirmek için aşağıdakine benzer bir ifade kullanabiliriz:

db.employees.updateMany(
    {
        "last_raise_date": {
            "$lte": new Date("2024-01-01")
        }
    },
    {
        "$mul": { "salary": 1.06 },
        "$set": { "last_raise_date": new Date() }
    }
);

Peki, yukarıdaki updateMany işlemi ne yapıyor?

Bir adım geri gidersek, updateMany operatörü isteğe bağlı üçüncü bir parametreyle birlikte iki parametre alır. 

  • İlk parametre, filtrelemek istediğimiz verileri temsil eden bir nesnedir. 
  • İkinci parametre, filtrede bulunan sonuçlara uygulamak istediğimiz değişikliklerdir. 
  • İsteğe bağlı üçüncü parametre, eşleşme olmazsa bir belge ekleyecek olan { “upsert”: true } olabilir.

Bunu göz önünde bulundurarak, önce last_raise_date alanı "2024-01-01" tarihinden önce olan tüm belgeleri filtreliyoruz. Temel veri kümemize baktığımızda, üç belgeden ikisinin eşleştiğini biliyoruz:

[
    { "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
    { "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") }
];

Değişiklik ölçütü parametresine göre filtrelenen belgelere iki farklı değişiklik uygulanacaktır.

"$mul": { "salary": 1.06 },

Önce, alanlarımızdan birini bir değerle çarpmak için $mul operatörünü kullanıyoruz. Örneğimizde, uygun olan her çalışana %6 maaş artışı vermek istiyoruz. Bu, alanın mevcut değerini 1,06 ile çarptığımız anlamına gelir.

Maaş ayarlamalarını belgelemeye yardımcı olmak ve gelecekte yanlışlıkla artış yapılmasını önlemek için last_raise_date alanını geçerli tarihle güncellemek istiyoruz:

"$set": { "last_raise_date": new Date() }

updateMany işlemini tekrar çalıştıracak olursak, filtredeki last_raise_date artık üç belgemizden hiçbiriyle eşleşmeyeceği için hiçbir şey olmayacaktır.

Yukarıdaki yalnızca bir örnek; ancak filtre ölçütleriniz çok daha karmaşık olabilir ve benzer şekilde, değiştirmeyi planladıklarınız da kullanım durumunuza bağlı olarak daha karmaşık olabilir. MongoDB'nin updateMany özelliği hakkında daha fazla bilgiyi bu videoda edinebilirsiniz. 

MongoDB İndeksi ile Güncellemenizin Performansını Artırın

Örneğimizde, üç küçük belgeyle çalışıyorduk. Koleksiyonumuza hangi işlemi uygularsak uygulayalım, çok büyük bir veriyle uğraşmadığımız için hızlı olacaktır. Ancak, milyonlarca belgeyle çalıştığınız veya güncelleme işlemini sık sık çalıştırdığınız bir üretim uygulamasını düşünün.

Milyonlarca belge üzerinde updateMany operatörünü kullanmaya çalışırsak, filtre ölçütümüz için uygun bir indeks oluşturulmadığı sürece işlem zaman alabilir.

Örneğimiz için bir indeks oluşturmak üzere şu gibi bir komut çalıştırabiliriz:

db.employees.createIndex({ "last_raise_date": 1 });

updateMany işleminin indeksimizi kullandığını aşağıdakini çalıştırarak doğrulayabilirsiniz:

db.runCommand({
    "explain": {
        "update": "employees",
        "updates": [
            {
                "q": { 
                    "last_raise_date": { 
                        "$lte": new Date("2024-01-01") 
                    }
                },
                "u": {
                    "$mul": { "salary": 1.06 },
                    "$set": { "last_raise_date": new Date() }
                }
            }
        ]
    },
    "verbosity": "allPlansExecution"
});

Sonuçlarda inputStage "IXSCAN" ise, bir indeks kullanıyorsunuz ve updateMany performansınızı en üst düzeye çıkarıyorsunuz demektir. inputStage "COLLSCAN" ise indeks kullanılmıyordur ve filtre ölçütlerinize göre indeksi nasıl oluşturduğunuzu yeniden düşünmeniz gerekebilir.

Herhangi bir karışıklığı gidermek için belirtelim: Yukarıda birden fazla belgeyi güncelleme işlemini profillemek amacıyla runCommand kullanıyoruz. Profil bilgisine ihtiyacınız yoksa, çok daha basit ve zarif olan updateMany işlemini kullanın.

Sonuç

MongoDB'de tek bir işlemle birden fazla belgeyi güncellemek, bu eğitim boyunca görüldüğü gibi zor bir görev değildir. 

updateMany operatörünü kullanarak, belgelerimizi eşleştirmek için bir filtre ölçütü ve yapılacak değişikliklerin bir listesini içeren bir değişiklik ölçütü tanımlayabiliriz. Bu updateMany işlemi, filtre ölçütlerinize uygun bir indeksiniz olduğundan emin olarak daha da optimize edilebilir.

İlişkisel olmayan veritabanlarında yeniyseniz, Introduction to NoSQL kursu, belge depoları gibi kavramlara yardımcı bir genel bakış sunar.

SSS

MongoDB'de updateOne ile updateMany arasındaki fark nedir?

 updateOne ilk eşleşen belgeyi değiştirirken, updateMany filtre ölçütlerini karşılayan tüm belgeleri günceller. Değişikliğin kapsamına göre seçim yapın.

updateMany, MongoDB'de upsert ile kullanılabilir mi?

Evet, üçüncü argüman olarak { upsert: true } eklemek, eşleşme bulunmazsa yeni bir belge ekler. Ancak, bu daha çok updateOne ile yaygındır.

updateMany için yaygın kullanım alanları nelerdir?

Genellikle fiyatları ayarlama, kullanıcı durumlarını değiştirme veya büyük veri kümelerindeki eski alanları temizleme gibi toplu güncellemelerde kullanılır.

updateMany herhangi bir sonuç verisi döndürür mü?

Evet, kaç belgenin eşleştiğini ve güncellendiğini belirten matchedCount ve modifiedCount gibi bilgiler içeren bir nesne döndürür.

updateMany'de filtreyle eşleşen belge olmazsa ne olur?

Eğer hiçbir belge eşleşmez ve upsert kullanılmazsa, işlem herhangi bir değişiklik olmadan tamamlanır. Hata fırlatılmaz.

MongoDB'de updateMany atomik midir?

Hayır, birden fazla belge üzerinde atomik değildir. Her belge güncellemesi kendi içinde atomiktir ancak topluca değildir.

updateMany işlemlerinin performansını nasıl test edebilirim?

Sorgunuzun bir indeks kullanıp kullanmadığını veya koleksiyon taraması yapıp yapmadığını görmek için explain() veya runCommand({ explain: ... }) yöntemlerini kullanın.

updateMany içinde birden fazla güncelleme operatörünü zincirleyebilir miyim?

Evet, MongoDB tek bir updateMany çağrısında $set, $inc, $mul vb. operatörlerin birleştirilmesini destekler.

İndekslerin updateMany işlemleri üzerindeki etkisi nedir?

İndeksler, filtreleme sırasında taranan belge sayısını azaltarak performansı önemli ölçüde artırabilir.

Yanlışlıkla yapılan bir updateMany işlemini nasıl geri alırım?

MongoDB, updateMany için yerleşik bir geri alma özelliğine sahip değildir; bir yedeğe veya günlük kaydına dönmeniz gerekir. Her zaman önce aşama ortamında test edin ve üretim verilerini yedekleyin.

Nic Raboy

Yazar

Nic Raboy

Nic Raboy , MongoDB'de Geliştirici İlişkileri Lideridir ve MongoDB'yi projelerine dahil etmelerinde geliştiricilerin başarılı olmasına yardımcı olacak harika içerikler üreten Python, Java, C# ve PHP geliştiricilerinden oluşan bir ekibi yönetir. Golang ve JavaScript konusunda deneyime sahiptir ve sık sık geliştirme maceraları hakkında yazılar yazar.

Konular

İlgili