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.
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") },];Altyapı:
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:
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") }];Altyapı:
Değişiklik ölçütü parametresine göre filtrelenen belgelere iki farklı değişiklik uygulanacaktır.
Ö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:
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:
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.
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.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
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
updateManydaha 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:
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
updateManyoperatöründen yararlanabiliriz. Görevimizi yerine getirmek için aşağıdakine benzer bir ifade kullanabiliriz:Peki, yukarıdaki
updateManyişlemi ne yapıyor?Bir adım geri gidersek,
updateManyoperatörü isteğe bağlı üçüncü bir parametreyle birlikte iki parametre alır.{ “upsert”: true }olabilir.Bunu göz önünde bulundurarak, önce
last_raise_datealanı "2024-01-01" tarihinden önce olan tüm belgeleri filtreliyoruz. Temel veri kümemize baktığımızda, üç belgeden ikisinin eşleştiğini biliyoruz:Değişiklik ölçütü parametresine göre filtrelenen belgelere iki farklı değişiklik uygulanacaktır.
Önce, alanlarımızdan birini bir değerle çarpmak için
$muloperatö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_datealanını geçerli tarihle güncellemek istiyoruz:updateManyişlemini tekrar çalıştıracak olursak, filtredekilast_raise_dateartı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
updateManyoperatö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:
updateManyişleminin indeksimizi kullandığını aşağıdakini çalıştırarak doğrulayabilirsiniz:Sonuçlarda
inputStage"IXSCAN" ise, bir indeks kullanıyorsunuz veupdateManyperformansı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
runCommandkullanıyoruz. Profil bilgisine ihtiyacınız yoksa, çok daha basit ve zarif olanupdateManyiş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.
updateManyoperatö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. BuupdateManyiş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.