İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

MongoDB’de insertOne ve insertMany ile Belge Nasıl Eklenir?

mongodb-insertone-insertmany-belge-ekleme
Bu yazıda neler var?
  1. Belge ve koleksiyon SQL kavramlarıyla nasıl eşleşir?
  2. insertOne ile tek kitap belgesi nasıl eklenir?
  3. insertMany ile birden fazla belge nasıl eklenir?
  4. ordered seçeneği hata sonrası eklemeyi nasıl etkiler?
  5. find() ile eklenen kitaplar nasıl kontrol edilir?
  6. Sık Sorulan Sorular

MongoDB’de insertOne() ve insertMany() ile belge eklemek için önce hedef veritabanını ve koleksiyonu seçer, ardından tek belge için insertOne(), birden fazla belge için insertMany() çalıştırırsın. _id alanını kendin belirtmezsen MongoDB belgeye bir ObjectId ekler ve ekleme sonucunda bu kimliği gösterir.

SQL bilen biri için temel eşleşme satır ile belge, sütun ile alan ve tablo ile koleksiyon arasındadır. MongoDB belgesi alan ve değer çiftlerinden oluşur; alan değerleri içinde başka belgeler ve diziler de bulunabilir.

Belge ve koleksiyon SQL kavramlarıyla nasıl eşleşir?

Başlangıçta MongoDB kavramlarını aşağıdaki SQL karşılıklarıyla düşünmek işini kolaylaştırır. Bu benzetme kavramları anlamak için kullanışlıdır; iki veritabanı modeli her ayrıntıda aynı yapıya sahip değildir.

SQL karşılığı MongoDB karşılığı Kitap örneği
Satır Belge Tek bir kitabın tüm bilgileri
Sütun Alan title, author, publishedYear
Tablo Koleksiyon kitaplar
Birincil anahtar _id alanı ObjectId(...)

Örneğin bir kitap belgesi şu şekilde iç içe veri taşıyabilir:

{
  title: "Dune",
  author: {
    name: "Frank Herbert",
    country: "ABD"
  },
  categories: ["Bilim kurgu", "Roman"]
}

Burada title, author ve categories birer alandır. author alanı kendi içinde başka alanlar barındıran bir belge, categories ise bir dizi içerir. Böylece kitapla ilgili bazı bilgiler aynı belgenin içinde birlikte tutulabilir.

mongosh içinde önce kutuphane veritabanına geçip kitaplar koleksiyonunu kullanabilirsin:

use kutuphane
db.kitaplar

use kutuphane komutu aktif veritabanını seçer. db.kitaplar ifadesi ise bu veritabanındaki kitaplar koleksiyonuna başvurur. Koleksiyon henüz yoksa insertOne() veya insertMany() ile yapılan ekleme işlemi koleksiyonu da oluşturabilir. İlk komut hata verirse başarılı ekleme gerçekleştiğini varsaymadan işlem sonucunu kontrol etmek gerekir.

insertOne ile tek kitap belgesi nasıl eklenir?

insertOne ile tek kitap belgesi nasıl eklenir?

insertOne(), koleksiyona tek bir belge ekler. SQL’deki tek satırlık INSERT işlemine benzetebilirsin; ancak burada sütun listesini ve değer listesini ayrı yazmak yerine alan adlarını doğrudan belgenin içinde belirtirsin.

db.kitaplar.insertOne({
  title: "Dune",
  author: "Frank Herbert",
  publishedYear: 1965,
  available: true
})

Bu örnekte title ve author metin, publishedYear sayı, available ise mantıksal değerdir. Alan adlarını yazarken yazım tutarlılığına dikkat etmelisin. Örneğin bir belgede publishedYear, başka bir belgede publicationYear kullanmak sorguları ve uygulama kodunu gereksiz şekilde karmaşıklaştırabilir.

_id alanı komutta bulunmadığı için MongoDB belgeye otomatik bir kimlik ekler. Başarılı bir işlemden sonra mongosh içinde buna benzer temsili bir sonuç görebilirsin:

{
  acknowledged: true,
  insertedId: ObjectId("65f1a2b3c4d5e6f789012345")
}

acknowledged işlemin onaylandığını, insertedId ise eklenen belgenin _id değerini gösterir. Oluşturulan ObjectId her çalıştırmada değişebileceği için örnekteki sabit değeri beklememelisin.

insertMany ile birden fazla belge nasıl eklenir?

insertMany ile birden fazla belge nasıl eklenir?

insertMany(), belgeleri bir dizi içinde alır ve her dizi elemanını ayrı bir belge olarak ekler. SQL’de birden fazla satırı tek işlemde eklemeye benzer. Ayrıntılı sözdizimi için MongoDB insertMany belgelerine bakabilirsin.

db.kitaplar.insertMany([
  {
    title: "Suç ve Ceza",
    author: "Fyodor Dostoyevski",
    year: 1866
  },
  {
    title: "1984",
    author: "George Orwell",
    year: 1949
  },
  {
    title: "Dönüşüm",
    author: "Franz Kafka",
    year: 1915
  }
])

Belgelerde _id alanı bulunmadığı için MongoDB her belgeye otomatik bir ObjectId atar. mongosh çıktısında insertedIds alanı, dizi sıralarını sayısal anahtarlarla ilişkilendirir:

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("64f000000000000000000001"),
    '1': ObjectId("64f000000000000000000002"),
    '2': ObjectId("64f000000000000000000003")
  }
}

Buradaki '0', ilk belgeyi; '1', ikinci belgeyi; '2' ise üçüncü belgeyi temsil eder. ObjectId değerleri her çalıştırmada değişir. Tek belge eklemek için insertMany() içine doğrudan nesne vermek yerine insertOne() kullanmalısın. Dizi verilmediğinde mongosh, girişin belge dizisi olması gerektiğini belirten MongoInvalidArgumentError hatası üretir.

MongoDB belgeleri esnek olduğu için, şema doğrulaması yoksa aynı işlemde farklı alanlara sahip belgeler bulunabilir. Ancak bir belgede author, diğerinde yazar kullanmak sorguları ve uygulama kodunu zorlaştırır. Kullanıcı girdisini doğrudan belgeye aktarmak yerine izin verilen alanları seçmek, veri türlerini kontrol etmek ve istemcinin gönderdiği _id değerlerini doğrulamak daha güvenlidir.

işlem beklenen giriş sonuçta izlenecek alan uygun kullanım biçimi
insertOne() Tek belge insertedId Tek bir kitap ekleme
insertMany() Belge dizisi insertedIds Birden fazla kitabı birlikte ekleme
insertOne() Tek işlem, hatayı ayrı değerlendirme Tek işlem sonucu Okunabilirliğin ve tekil hata yönetiminin önemli olduğu durumlar
insertMany() Birden çok belge, isteğe bağlı ordered insertedIds veya hata sonucu Toplu veri yükleme

ordered seçeneği hata sonrası eklemeyi nasıl etkiler?

ordered seçeneğinin varsayılan değeri true olur. Bu ayarda belgeler sırayla işlenir ve bir belge eklenirken hata oluşursa sıradaki belgeler işlenmez.

db.kitaplar.insertMany([
  { _id: 7001, title: "Kitap A" },
  { _id: 7001, title: "Kitap B" },
  { _id: 7002, title: "Kitap C" }
])

İlk belge eklenir. İkinci belgede aynı _id kullanıldığı için E11000 duplicate key error oluşur ve üçüncü belgeye geçilmez. _id, koleksiyon içinde benzersiz olması gereken özel alandır.

ordered: false kullanıldığında hata alan belge atlanır ve kalan belgeler işlenmeye devam eder:

db.kitaplar.insertMany([
  { _id: 7101, title: "Kitap D" },
  { _id: 7101, title: "Kitap E" },
  { _id: 7102, title: "Kitap F" }
], { ordered: false })
MongoBulkWriteError: E11000 duplicate key error
Result: BulkWriteResult {
  insertedCount: 2,
  insertedIds: {
    '0': 7101,
    '2': 7102
  }
}

Bu çıktıda '1' anahtarının bulunmaması, dizinin ikinci elemanının hata aldığını gösterir. ordered: false kullanıldığında ekleme sırasına güvenilmemelidir; önemli olan başarılı ve hatalı işlemleri sonuç içindeki indekslerle birlikte değerlendirmektir.

Eski db.collection.insert() yöntemi mongosh içinde kullanımdan kaldırılmıştır. Tek belge için insertOne(), belge dizisi için insertMany() kullanmak, işlemin amacını ve hata davranışını daha açık hâle getirir. Güncel yöntem ayrımı için MongoDB insert yöntemi belgelerini inceleyebilirsin.

find() ile eklenen kitaplar nasıl kontrol edilir?

Ekleme işlemlerinden sonra kitapları görüntülemek için ilgili veritabanı ve koleksiyonda find() komutunu çalıştırabilirsin. Aşağıdaki sorgu, kitapların kimlik, ad, yazar ve yayın yılı alanlarını gösterir:

use kutuphane

db.kitaplar.find(
  {},
  { _id: 1, kitapAdi: 1, yazar: 1, yil: 1 }
)

Temsili bir sonuç şu şekilde görünebilir:

{
  _id: ObjectId('65a000000000000000000001'),
  kitapAdi: 'Suç ve Ceza',
  yazar: 'Fyodor Dostoyevski',
  yil: 1866
}
{
  _id: ObjectId('65a000000000000000000002'),
  kitapAdi: '1984',
  yazar: 'George Orwell',
  yil: 1949
}

_id her belgenin koleksiyon içindeki benzersiz kimliğidir. Değer olarak ObjectId kullanılması yaygındır. kitapAdi, yazar ve yil ise uygulamanın kitap bilgilerini okuduğu alanlardır. Bir alanı projeksiyonda 1 ile belirtmek, o alanın sonuçta gösterilmesini sağlar; _id ayrıca dışlanmadığı sürece sonuçlarda yer alır.

Alan adlarının belgeler arasında tutarlı olması sorguların doğru çalışması için önemlidir. Örneğin bir belgede kitap adı kitapAdi, başka bir belgede title olarak kaydedilirse db.kitaplar.find({ kitapAdi: '1984' }) sorgusu yalnızca kitapAdi alanını taşıyan belgeyi bulur. kitap_adı veya title kullanan belge sonuçta görünmeyebilir ve uygulama kodu her iki alanı ayrı ayrı ele almak zorunda kalabilir.

Kullanıcıdan gelen veriyi doğrudan belgeye eklerken beklenmeyen alanları ve veri tiplerini sınırlamak için izin verilen alanları önceden seçmek daha güvenlidir. İstemcinin gönderdiği _id değerleri de dikkatle ele alınmalıdır; aynı koleksiyonda yinelenen bir değer ekleme hatasına yol açabilir.

  • Doğru veritabanı ve kitaplar koleksiyonunun seçildiğini kontrol et.
  • insertMany() kullanıyorsan girişin belge dizisi olduğundan emin ol.
  • Belirlediğin _id değerlerinin koleksiyon içinde benzersiz olmasına dikkat et.
  • kitapAdi, yazar ve yil gibi alan adlarını tüm belgelerde aynı tut.
  • Ekleme işleminden sonra find() ile kayıtları doğrula.

Sık Sorulan Sorular

insertOne ile insertMany arasındaki temel fark nedir?

insertOne() tek bir belge ekler, insertMany() ise belgelerden oluşan bir dizi alarak birden fazla belgeyi aynı işlem içinde ekler.

insertMany ile tek bir belge eklemek mümkün mü?

insertMany() tek bir belge nesnesi yerine belge dizisi bekler. Tek kayıt eklemek için insertOne() kullanmak daha doğru yöntemdir.

insertOne sonucundaki insertedId neyi gösterir?

insertedId, başarıyla eklenen belgenin _id değerini gösterir. Belgeye _id verilmemişse ekleme sırasında oluşturulan kimlik bu alanda döndürülür.

Aynı _id değeriyle iki belge eklenirse neden E11000 hatası alınır?

_id alanı koleksiyon içinde benzersiz olmalıdır. Aynı değer ikinci kez eklenmeye çalışıldığında benzersiz kimlik kuralı ihlal edildiği için E11000 yinelenen anahtar hatası oluşur.

ordered false kullanıldığında hatalı belgenin ardından ne olur?

ordered: false kullanıldığında hatalı belge eklenmez, ancak işlem kalan belgeleri denemeye devam eder. Bu nedenle aynı işlemde bazı belgeler eklenmiş, bazıları ise hata nedeniyle eklenmemiş olabilir.

MongoDB’de güvenilir bir ekleme akışı için komutu doğru koleksiyonda çalıştırmak, belge yapısını tutarlı tutmak ve işlem sonrasında kayıtları find() ile kontrol etmek iyi bir başlangıçtır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara