Dizinlere genel bakış

Bu sayfada, Cloud Firestore için dizine ekleme işlemi açıklanmaktadır. Cloud Firestore, varsayılan olarak dizin oluşturmaz. Veritabanı performansını artırmak için en çok tercih ettiğiniz sorgulara yönelik dizinler oluşturun.

Dizinlerin, veritabanının performansı üzerinde büyük bir etkisi vardır. Bir sorgu için dizin varsa veritabanı, taranması gereken veri miktarını ve sonuçları sıralamak için gereken işi azaltarak sonuçları verimli bir şekilde döndürebilir. Ancak dizin girişleri, depolama maliyetlerini ve dizine eklenen alanlarda yazma işlemi sırasında yapılan iş miktarını artırır.

Dizin tanımı ve yapısı

Dizin aşağıdakilerden oluşur:

  • Koleksiyon kimliği
  • Belirli bir koleksiyondaki alanların listesi
  • Her alan için artan veya azalan düzende bir sıralama

Dizinler ayrıca seyrek, çoklu anahtar veya benzersiz seçeneklerini de etkinleştirebilir.

Dizin sıralaması

Her alanın sırası ve sıralama yönü, dizini benzersiz şekilde tanımlar. Örneğin, aşağıdaki dizinler iki farklı dizindir ve birbirinin yerine kullanılamaz:

Toplama Alanlar
şehirler ülke (artan), nüfus (azalan)
şehirler nüfus (azalan), ülke (artan),

Bir sorguyu desteklemek için dizin oluştururken alanları sorgunuzla aynı sırayla ekleyin.

Dizin yoğunluğu

Varsayılan olarak dizin girişleri, bir koleksiyondaki tüm dokümanların verilerini depolar. Buna seyrek olmayan dizin denir. Dokümanın dizinde belirtilen alanlardan herhangi birini içerip içermediğine bakılmaksızın doküman için bir dizin girişi eklenir. Dizin girişleri oluşturulurken mevcut olmayan alanlar NULL değerine sahip olarak kabul edilir. Bu davranışı değiştirmek için dizini seyrek dizin olarak tanımlayabilirsiniz.

Seyrek dizinler

Seyrek dizin, koleksiyonda yalnızca dizine eklenen alanlardan en az biri için değer (boş değer dahil) içeren dokümanları dizine ekler. Seyrek dizin, depolama maliyetlerini azaltır ve performansı artırabilir.

Dizi değerleri için çoklu anahtar dizinleri

Dizi değerleri içeren bir alanda dizin oluşturuyorsanız çoklu anahtar dizini oluşturmanız gerekir. Normal bir dizin, dizi değerlerini dizine ekleyemez. Çoklu anahtar dizini, dizin tanımında en fazla bir dizi alanını destekler ve dizi değerlerini geçen işlemler için kullanılabilir.

Yalnızca dizi değerlerini dizine eklemeniz gerektiğini biliyorsanız çoklu anahtar dizinleri kullanın. Normal dizinlerin, sorgu işleme konusunda avantajları vardır. Örneğin, normal dizinler bir aralıktaki değerleri daha verimli bir şekilde filtreleyebilir.

Dizi değerleri ve çoklu anahtar dizinleriyle çalışırken aşağıdaki durumlar hatalara yol açar:

  • Bir işlem, normal dizin tarafından dizine eklenen bir alana dizi değeri eklemeye çalışıyor. Dizi değerini eklemek için ilgili alandaki mevcut normal dizinleri silmeniz ve bunları çoklu anahtar dizinleri olarak yeniden oluşturmanız gerekir.
  • Dizi değeri içeren bir alanda normal dizin oluşturmaya çalışırsanız. Çok anahtarlı bir dizin oluşturmanız veya dizi değerlerini silmeniz gerekir.
  • Bir işlem, dizi değerleri içeren birden fazla alanı dizine eklemeye çalışıyor. Çok anahtarlı bir dizinde dizi değeri içeren birden fazla alanınız olamaz. Devam etmek için veri modelinizi veya dizin tanımlarınızı değiştirin.
  • İki alan yolunun users.posts ve users.zip gibi ortak bir ön eki paylaştığı çok anahtarlı bir dizin oluşturmaya çalışıyorsunuz.

Benzersiz dizinler

Dizine eklenen alanlar için benzersiz değerleri zorunlu kılmak üzere benzersiz dizin seçeneğini ayarlayın. Birden fazla alan içeren dizinlerde, her değer kombinasyonu dizin genelinde benzersiz olmalıdır. Veritabanı, yinelenen değerlere sahip dizin girişleri oluşturmaya çalışan tüm güncelleme ve ekleme işlemlerini reddeder. Dizine eklenen alanların verileri yinelenen değerler içeriyorsa ve benzersiz bir dizin oluşturmaya çalışırsanız dizin oluşturma işlemi başarısız olur ve işlem ayrıntılarında bir hata mesajı gösterilir.

Benzersiz bir dizinde eksik alanlar

Benzersiz dizin için eksik alanları olan bir doküman eklerseniz dizin, eksik alanlar için null değerlerini ayarlar. Oluşturulan dizin girişi benzersiz olmalıdır. Aksi takdirde işlem başarısız olur.

Örneğin, şu dizinde:

db.cities.createIndex( { "name": 1 }, { unique: true } )

{"abbreviation": "LA"} dokümanını koleksiyona eklerseniz benzersiz dizin, name değeri null olarak ayarlanmış bir giriş oluşturur. Ardından {"abbreviation": "NYC"} dokümanını eklemeye çalışırsanız benzersiz dizin için elde edilen giriş aynı olduğundan işlem başarısız olur.

Aynı davranış, birden fazla alan içeren benzersiz dizinler için de geçerlidir. Bir doküman oluşturulurken veya güncellenirken eksik dizine eklenmiş alanlar null olarak ayarlanır ve sonuçta elde edilen dizin girişinin dizinde benzersiz olması gerekir.

Dizi değerlerinde benzersiz dizinler

Benzersiz bir çoklu anahtar dizini, belgelerin çakışan dizi öğelerine sahip olmamasını zorunlu kılmak için kullanılabilir.

Bu tür dizinler, bir dizinin tek bir dokümanda benzersiz değerlere sahip olmasını zorunlu kılmaz.

Örneğin, benzersiz bir dizinle:

db.collection.createIndex( { "tags": 1 }, { unique: true } )

Aşağıdaki belge eklenebilir:

{
  "_id": 1,
  "tags": [ "news", "tech", "news", "music" ]
}

Dizin, tek bir dokümanın aynı dizisinde yinelenen değerlere ("news") izin verir.

Yinelenen öğe içeren ikinci bir doküman eklemeye çalışırsanız işlem başarısız olur:

{
  "_id": 2,
  "tags": [ "sports", "music" ]
}

"music", 1 dokümanının dizisinde zaten mevcut olduğundan ve dizinde eşlendiğinden işlem başarısız oluyor.

Tek bir dokümandaki aynı dizide bulunan öğelerin benzersiz olmasını sağlamanız gerekiyorsa bunu uygulama mantığınızda $push yerine $addToSet gibi güncelleme operatörleri kullanarak yapın.

Boş diziler, eksik alanlar ve boş değerler

Normalde, benzersiz bir dizindeki eksik alanlar null olarak değerlendirilir ve belgeler arasında benzersiz olmalıdır (Benzersiz bir dizindeki eksik alanlar bölümüne bakın). Ancak dizi alanlarındaki benzersiz dizinler için:

  • Boş diziler, eksik alanlar ve bağımsız null değerleri: Dizi alanı boşsa, tamamen eksikse veya bağımsız bir null değeri barındırıyorsa (dizi içinde değil) doküman için dizin anahtarı oluşturulmaz. Bu nedenle, birden fazla dokümanda boş alanlar veya bağımsız null değerleri bulunabilir ve yinelenen anahtar hataları tetiklenmez.
  • Dizi içindeki boş öğeler: Dizi, öğe olarak null değeri içeriyorsa (örneğin, ["news", null]) null öğesi dizine eklenir. Dizine eklenmiş dizi alanında null öğesi içeren sonraki tüm dokümanlar, yinelenen anahtar hatasıyla başarısız olur.

TTL dizinleri

Veritabanlarınızdaki eski verileri otomatik olarak kaldırmak için TTL dizinlerini kullanın. TTL dizini, belirli bir alanı belirli bir koleksiyondaki dokümanların geçerlilik bitiş zamanı olarak belirler. TTL ile eski verileri temizleyerek depolama maliyetlerini azaltabilirsiniz. Veriler genellikle geçerlilik süresi dolduktan sonraki 24 saat içinde silinir.

Dizin oluşturma hatalarını giderme

Dizinlerinizi yönetirken dizin oluşturma hatalarıyla karşılaşabilirsiniz. Veritabanında verilerle ilgili bir sorunla karşılaşılırsa dizine ekleme işlemi başarısız olabilir. Dizine ekleme işlemleri aşağıdaki nedenlerle başarısız olabilir:

  • Dizin sınırına ulaştınız. Örneğin, işlem, doküman başına maksimum dizin girişi sayısına ulaşmış olabilir. Dizin oluşturma işlemi başarısız olursa bir hata mesajı görürsünüz. Dizin sınırına ulaşmadıysanız dizin işlemini tekrar deneyin.
  • Çoklu anahtar dizini gereklidir. Dizine eklenen alanlardan en az biri bir dizi değeri içeriyor. Devam etmek için çoklu anahtar dizini kullanmanız veya dizi değerlerini silmeniz gerekir.
  • Bir işlem, dizi değerleri içeren birden fazla alanı dizine eklemeye çalışıyor. Çok anahtarlı bir dizinde dizi değeri içeren birden fazla alanınız olamaz. Devam etmek için veri modelinizi veya dizin tanımlarınızı değiştirin.
  • Benzersiz dizin seçeneğini ayarladınız ve dizine eklenen alanların verileri yinelenen dizin girişleri oluşturuyor. Devam etmek için verilerdeki yinelenen değer kombinasyonlarını kaldırın.

Sırada ne var?