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(), 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(), 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
kitaplarkoleksiyonunun seçildiğini kontrol et. insertMany()kullanıyorsan girişin belge dizisi olduğundan emin ol.- Belirlediğin
_iddeğerlerinin koleksiyon içinde benzersiz olmasına dikkat et. kitapAdi,yazarveyilgibi 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.