Cloud Firestore'daki dizin türleri

Dizinler, veritabanı performansında önemli bir faktördür. Bir kitaptaki konuları sayfa numaralarıyla eşleyen bir kitap dizini gibi, bir veritabanı dizini de bir veritabanındaki öğeleri veritabanındaki konumları ile eşleştirir. Bir veritabanına sorgu gönderdiğinizde veritabanı, istediğiniz öğelerin konumlarını hızlı bir şekilde aramak için bir dizin kullanabilir.

Bu sayfada, Cloud Firestore'un kullandığı iki dizin türü (tek alanlı dizinler ve birleşik dizinler) açıklanmaktadır.

Dizin tanımı ve yapısı

Belirli bir belgedeki alanlar listesinde, her bir alan için karşılık gelen dizin modu ile birlikte bir dizin tanımlanır.

Bir dizin, dizinin tanımında adı geçen her alan için bir giriş içerir. Dizin, dizine dayalı sorgular için olası sonuç olan tüm dokümanları içerir. Bir doküman, yalnızca dizinde kullanılan her alan için dizine eklenmiş bir değere sahip olduğunda dizine eklenir. Dizin tanımı, dokümanda değer ayarlanmamış bir alana işaret ederse bu doküman dizinde görünmez ve dolayısıyla dizine dayalı sorguların sonucu olarak hiçbir zaman döndürülmez.

Bileşik dizin, alan değerlerine göre, dizin tanımında belirtilen sırada sıralanır.

Her sorgunun arkasındaki dizin

Bir sorgu için dizin yoksa çoğu veritabanı, içeriklerini öğe bazında tarar. Bu, veritabanı büyüdükçe daha da yavaş bir işlem olan yavaş bir süreçtir. Cloud Firestore, tüm sorgular için dizinleri kullanarak yüksek sorgu performansını garanti eder. Sonuç olarak, sorgu performansı veritabanındaki öğe sayısına değil, sonuç kümesinin boyutuna bağlıdır.

Daha az dizin yönetimi, daha fazla uygulama geliştirme

Cloud Firestore, dizinleri yönetmek için harcamanız gereken süreyi azaltan özellikler içerir. En temel sorgular için gereken dizinler sizin için otomatik olarak oluşturulur. Uygulamanızı kullanıp test ederken Cloud Firestore, uygulamanızın gerektirdiği ek dizinleri belirlemenize ve oluşturmanıza yardımcı olur.

Dizin türleri

Cloud Firestore iki tür dizin kullanır: tek alanlı ve birleşik. Dizine eklenen alan sayısının yanı sıra tek alanlı ve birleşik dizinler bunları yönetme şeklinizde farklılık gösterir.

Tek alanlı dizinler

Tek alanlı dizin, belirli bir alan içeren bir koleksiyondaki tüm dokümanların sıralı eşlemesini depolar. Tek alanlı dizindeki her giriş, bir dokümanın belirli bir alan için değerini ve dokümanın veritabanındaki konumunu kaydeder. Cloud Firestore, birçok temel sorguyu gerçekleştirmek için bu dizinleri kullanır. Veritabanınızın otomatik dizine ekleme ayarlarını ve dizin muafiyetlerini yapılandırarak tek alanlı dizinleri yönetebilirsiniz.

Otomatik dizine ekleme

Varsayılan olarak Cloud Firestore, belgedeki her alan ve haritadaki her alt alan için tek alanlı dizinleri otomatik olarak korur. Cloud Firestore, tek alanlı dizinler için aşağıdaki varsayılan ayarları kullanır:

  • Cloud Firestore, dizi olmayan ve eşleme olmayan her alan için biri artan, diğeri azalan modda olmak üzere iki koleksiyon kapsamlı tek alanlı dizin tanımlar.

  • Cloud Firestore, her eşleme alanı için aşağıdakileri oluşturur:

    • Dizi olmayan, harita dışı her alt alan için bir koleksiyon kapsamlı artan dizin.
    • Dizi olmayan, harita dışı her alt alan için bir koleksiyon kapsamı azalan dizin.
    • Her dizi alt alanı için bir koleksiyon kapsamı dizi-içeren dizin.
    • Cloud Firestore, her harita alt alanını yinelemeli olarak dizine ekler.
  • Cloud Firestore, belgedeki her dizi alanı için koleksiyon kapsamlı bir dizi içeren dizin oluşturur ve bu dizinin bakımını yapar.

  • Toplama grubu kapsamına sahip tek alanlı dizinler varsayılan olarak korunmaz.

Tek alanlı dizin muafiyetleri

Tek alanlı dizin muafiyeti oluşturarak bir alanı otomatik dizine ekleme ayarlarınızdan muaf tutabilirsiniz. Dizine ekleme muafiyeti, veritabanı genelindeki otomatik dizin ayarlarını geçersiz kılar. Muafiyet, otomatik dizine ekleme ayarlarınızın otomatik dizine eklemenin başka şekilde etkinleştireceği tek alanlı bir dizini devre dışı bırakacağı veya devre dışı bırakacağı tek alanlı bir dizini etkinleştirebilir. Muafiyetlerin faydalı olabileceği durumlar için dizine eklemeyle ilgili en iyi uygulamaları inceleyin.

Bir koleksiyon grubundaki tüm alanlarda koleksiyon düzeyinde dizin muafiyetleri eklemek için * alan yolu değerini kullanın. Örneğin, comments koleksiyon grubu için alan yolunu comments koleksiyon grubundaki tüm alanlarla eşleşecek şekilde * olarak ayarlayın ve koleksiyon grubu altındaki tüm alanların dizine eklenmesini devre dışı bırakın. Daha sonra, yalnızca sorgularınız için gerekli olan alanları dizine eklemek üzere muafiyetler ekleyebilirsiniz. Dizine eklenen alanların sayısını azaltmak, depolama maliyetlerini azaltır ve yazma performansını artırabilir.

Bir eşleme alanı için tek alanlı dizin muafiyeti oluşturursanız haritanın alt alanları bu ayarları devralır. Bununla birlikte, belirli alt alanlar için tek alanlı dizin muafiyetleri tanımlayabilirsiniz. Bir alt alan için muafiyeti silerseniz alt alan, varsa üst alanının muafiyet ayarlarını veya üst muafiyeti yoksa veritabanı genelindeki ayarları devralır.

Tek alanlı dizin muafiyetleri oluşturmak ve yönetmek için Cloud Firestore'da Dizinleri Yönetme bölümüne bakın.

Bileşik dizinler

Bileşik dizin, dizine eklenecek alanların sıralı listesine göre bir koleksiyondaki tüm dokümanların sıralı eşlemesini depolar.

Cloud Firestore, tek alanlı dizinler tarafından desteklenmeyen sorguları desteklemek için bileşik dizinler kullanır.

Cloud Firestore, olası çok sayıda alan kombinasyonundan dolayı tek alanlı dizinler için yaptığı gibi otomatik olarak bileşik dizinler oluşturmaz. Bunun yerine Cloud Firestore, uygulamanızı geliştirirken gerekli birleşik dizinleri tanımlamanıza ve oluşturmanıza yardımcı olur.

Bir dizin tarafından desteklenmeyen bir sorguyu denediğinizde Cloud Firestore, eksik dizini oluşturmak için izleyebileceğiniz bağlantının yer aldığı bir hata mesajı döndürür.

Ayrıca, konsolu veya Firebase KSA'yı kullanarak bileşik dizinleri manuel olarak tanımlayabilir ve yönetebilirsiniz. Bileşik dizinler oluşturma ve yönetme hakkında daha fazla bilgi için Dizinleri Yönetme bölümünü inceleyin.

Dizin modları ve sorgu kapsamları

Tek alanlı ve birleşik dizinleri farklı şekilde yapılandırırsınız ancak her ikisi için de dizinleriniz için dizin modlarını ve sorgu kapsamlarını yapılandırmanız gerekir.

Dizin modları

Bir dizin tanımladığınızda, dizine eklenen her alan için bir dizin modu seçersiniz. Her alanın dizin modu, o alanda belirli sorgu deyimlerini destekler. Aşağıdaki dizin modları arasından seçim yapabilirsiniz:

Dizin modu Açıklama
Artan Alanda <, <=, ==, >=, >, !=, in ve not-in sorgu deyimlerini ve bu alan değerine göre sonuçları artan düzende sıralamayı destekler.
Azalan Alanda <, <=, ==, >=, >, !=, in ve not-in sorgu deyimlerini destekler ve sonuçları bu alan değerine göre azalan düzende sıralamayı destekler.
Dizi-içerir Alanda array-contains ve array-contains-any sorgu ifadelerini destekler.
Vektör Alanda FindNearest sorgu deyimlerini destekler.

Sorgu kapsamları

Her dizin, bir koleksiyon veya koleksiyon grubuna ayarlanır. Bu, dizinin sorgu kapsamı olarak bilinir:

Koleksiyon kapsamı
Cloud Firestore varsayılan olarak koleksiyon kapsamıyla dizinler oluşturur. Bu dizinler, tek bir koleksiyondan sonuç döndüren sorguları destekler.

Koleksiyon grubu kapsamı
Koleksiyon grubu, aynı koleksiyon kimliğine sahip tüm koleksiyonları içerir. Bir koleksiyon grubundan filtrelenmiş veya sıralı sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip karşılık gelen bir dizin oluşturmanız gerekir.

Varsayılan sıralama ve __name__ alanı

Dizinler, belgeleri her alan için belirtilen dizin modlarına (artan veya azalan) göre sıralamanın yanı sıra her belgenin __name__ alanına göre son bir sıralama uygular. __name__ alanının değeri, tam belge yolu olarak ayarlanır. Bu, sonuç kümesindeki aynı alan değerlerine sahip dokümanların belge yoluna göre sıralandığı anlamına gelir.

Varsayılan olarak __name__ alanı, dizin tanımındaki son sıralı alanın yönünde sıralanır. Örnek:

Toplama Dizine eklenen alanlar Sorgu kapsamı
şehirler adı, __name__ Toplama
şehirler eyalet, __name__ Toplama
şehirler ülke, nüfus, __name__ Toplama

Sonuçları varsayılan olmayan __name__ yönüne göre sıralamak için bu dizini oluşturmanız gerekir.

Mükemmel Dizin

Bir sorgu için, sorgunun en verimli şekilde yürütülmesini sağlayan mükemmel dizin, sırasıyla aşağıdaki özelliklerde tanımlanır:

  1. Eşitlik filtrelerinde kullanılan alanlar
  2. Sıralama siparişlerinde kullanılan alanlar
  3. Aralık ve eşitsizlik filtrelerinde kullanılan (sıralama siparişlerine halihazırda dahil olmayanlar) alanlar
  4. Toplamalarda kullanılan alanlar (sıralama siparişleri ile aralık ve eşitsizlik filtrelerine halihazırda dahil olmayanlar)

Firestore, sorgulara ait sonuçları şu şekilde hesaplar:

  1. Sorgu koleksiyonuna, filtre özelliklerine, filtre operatörlerine ve sıralama siparişlerine karşılık gelen dizini tanımlar
  2. Sorgunun eşitlik filtrelerini ve alana göre ilk sırada aralık ve eşitsizlik filtrelerini kullanarak taramanın başlatılacağı dizin konumunu tanımlar
  3. Dizini taramaya başlar ve tüm filtrelere uygun olan her doküman, aşağıdaki görevlere uyana kadar döndürülür:
    1. filtre koşullarını karşılamayan bir dokümanla karşılaştığında ve sonraki tüm dokümanların filtre koşullarını hiçbir zaman tam olarak karşılamayacağını onayladığında veya
    2. dizinin sonuna ulaştığında veya
    3. sorgu tarafından istenen maksimum sayıda sonuç topladı

Dizine ekleme örneği

Cloud Firestore, sizin için otomatik olarak tek alanlı dizinler oluşturarak uygulamanızın en temel veritabanı sorgularını hızlı bir şekilde desteklemesini sağlar. Tek alanlı dizinler, alan değerlerine ve <, <=, ==, >=, > ve in karşılaştırıcılarına dayalı olarak basit sorgular gerçekleştirmenizi sağlar. Dizi alanlarında array-contains ve array-contains-any sorguları gerçekleştirmenize olanak tanır.

Örnek vermek için aşağıdaki örnekleri dizin oluşturma açısından inceleyin. Aşağıdaki snippet bir cities koleksiyonunda birkaç city dokümanı oluşturur ve her doküman için name, state, country, capital, population ve tags alanlarını ayarlar:

Web
var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

Varsayılan otomatik dizine ekleme ayarları varsa Cloud Firestore, dizi olmayan her alan için artan tek alanlı bir dizini, dizi olmayan alan başına bir azalan tek alanlı dizini ve dizi alanı için bir dizi içeren tek alanlı dizini günceller. Aşağıdaki tabloda yer alan her satır, tek alanlı dizindeki bir girişi temsil eder:

Toplama Alana dizine eklendi Sorgu kapsamı
şehirler adı Toplama
şehirler eyalet Toplama
şehirler ülke Toplama
şehirler büyük harf Toplama
şehirler nüfus Toplama
şehirler adı Toplama
şehirler eyalet Toplama
şehirler ülke Toplama
şehirler büyük harf Toplama
şehirler nüfus Toplama
şehirler array-contains bölge Toplama

Tek alanlı dizinler tarafından desteklenen sorgular

Otomatik olarak oluşturulan bu tek alanlı dizinleri kullanarak aşağıdakiler gibi basit sorgular çalıştırabilirsiniz:

Web
const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

Ayrıca in ve bileşik eşitlik (==) sorguları da oluşturabilirsiniz:

Web
citiesRef.where('country', 'in', ["USA", "Japan", "China"])

// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
         .where("capital", "==", false)
         .where("state", "==", "CA")
         .where("population", "==", 860000)

Aralık karşılaştırması (<, <=, > veya >=) kullanan bir bileşik sorgu çalıştırmanız veya farklı bir alana göre sıralama yapmanız gerekiyorsa bu sorgu için birleşik dizin oluşturmanız gerekir.

array-contains dizini, regions dizi alanını sorgulamanızı sağlar:

Web
citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

Bileşik dizinler tarafından desteklenen sorgular

Cloud Firestore, tek alanlı dizinler tarafından desteklenmeyen bileşik sorguları desteklemek için bileşik dizinler kullanır. Örneğin, aşağıdaki sorgular için bileşik bir dizine ihtiyacınız olur:

Web
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

Bu sorgular için aşağıdaki bileşik dizin gereklidir. Sorgu, country alanı için eşitlik (== veya in) kullandığından bu alan için artan veya azalan dizin modu kullanabilirsiniz. Varsayılan olarak eşitsizlik ifadeleri, eşitsizlik yan tümcesindeki alana göre artan bir sıralama düzeni uygular.

Toplama Dizine eklenen alanlar Sorgu kapsamı
şehirler (veya ) ülke, nüfus Toplama

Aynı sorguları azalan sıralama düzeniyle çalıştırmak isterseniz population için azalan yönde ek bir birleşik dizine ihtiyacınız vardır:

Web
citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
Toplama Dizine eklenen alanlar Sorgu kapsamı
şehirler ülke, nüfus Toplama
şehirler ülke, nüfus Toplama

Ayrıca, array-contains veya array-contains-any sorgusunu ek ifadelerle birleştirmek için bileşik dizin oluşturmanız gerekir.

Web
citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
Toplama Dizine eklenen alanlar Sorgu kapsamı
şehirler array-contains etiketleri, (veya ) büyük harf Toplama

Koleksiyon grubu dizinleri tarafından desteklenen sorgular

Koleksiyon grubu kapsamına sahip bir dizin göstermek için city belgelerinden bazılarına bir landmarks alt koleksiyonu eklediğinizi düşünün:

Web
var citiesRef = db.collection("cities");

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

Aşağıdaki tek alanlı dizini, toplama kapsamıyla kullanarak tek bir şehrin landmarks koleksiyonunu category alanına göre sorgulayabilirsiniz:

Toplama Dizine eklenen alanlar Sorgu kapsamı
önemli noktalar (veya ) kategorisi Toplama
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

Şimdi, tüm şehirlerdeki önemli noktalara sorgulama yapmak istediğinizi varsayalım. Bu sorguyu tüm landmarks koleksiyonlarından oluşan koleksiyon grubunda çalıştırmak için koleksiyon grubu kapsamına sahip bir landmarks tek alanlı dizini etkinleştirmeniz gerekir:

Toplama Dizine eklenen alanlar Sorgu kapsamı
önemli noktalar (veya ) kategorisi Koleksiyon grubu

Bu dizin etkinleştirildiğinde landmarks koleksiyon grubunu sorgulayabilirsiniz:

Web
var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

Filtrelenmiş veya sıralı sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip karşılık gelen bir tek alan veya birleşik dizin etkinleştirmeniz gerekir. Sonuçları filtrelemeyen veya sıralamayan koleksiyon grubu sorguları için ek dizin tanımı gerekmez.

Örneğin, ek bir dizin etkinleştirmeden aşağıdaki koleksiyon grubu sorgusunu çalıştırabilirsiniz:

Web
db.collectionGroup("landmarks").get()

Dizin girişleri

Bir belgenin dizin girişlerinin sayısı, projenizin yapılandırılmış dizinleri ve belge yapısı tarafından belirlenir. Dizin girişleri, dizin girişi sayısı sınırına dahil edilir.

Aşağıdaki örnekte bir dokümanın dizin girişleri gösterilmektedir.

Doküman

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

Tek Alanlı dizinler

  • şehir_adı ASC
  • şehir_adı DESC
  • sıcaklıklar.yaz ASC
  • sıcaklıklar.summer DESC
  • sıcaklıklar.winter ASC
  • sıcaklıklar.winter DESC
  • Mahalleler Dizisi İçerir (ASC ve DESC)

Bileşik dizinler

  • şehir_adı ASC, mahalleler ARRAY
  • şehir_adı DESC, mahalleler ARRAY

Dizin girişleri

Bu dizine ekleme yapılandırması, doküman için aşağıdaki 18 dizin girişiyle sonuçlanır:

Dizin Dizine eklenmiş veriler
Tek alanlı dizin girişleri
şehir_adı ASC City_name: "İstanbul"
şehir_adı DESC City_name: "İstanbul"
sıcaklıklar.yaz ASC sıcaklıklar.yaz: 67
sıcaklıklar.summer DESC sıcaklıklar.yaz: 67
sıcaklıklar.winter ASC sıcaklıklar.winter: 55
sıcaklıklar.winter DESC sıcaklıklar.winter: 55
mahalle dizisinde ASC içerir muhitler: "Misyon"
mahalleler Dizisi Şunu İçerir: DESC muhitler: "Misyon"
mahalle dizisinde ASC içerir mahalleler: "Şehir merkezi"
mahalleler Dizisi Şunu İçerir: DESC mahalleler: "Şehir merkezi"
mahalle dizisinde ASC içerir mahalleler: "İstanbul"
mahalleler Dizisi Şunu İçerir: DESC mahalleler: "İstanbul"
Bileşik dizin girişleri
şehir_adı ASC, mahalleler ARRAY City_name: "İstanbul", mahalleler: "İstanbul"
şehir_adı ASC, mahalleler ARRAY City_name: "İstanbul", mahalleler: "Şehir Merkezi"
şehir_adı ASC, mahalleler ARRAY City_name: "İstanbul", mahalleler: "İstanbul"
şehir_adı DESC, mahalleler ARRAY City_name: "İstanbul", mahalleler: "İstanbul"
şehir_adı DESC, mahalleler ARRAY City_name: "İstanbul", mahalleler: "Şehir Merkezi"
şehir_adı DESC, mahalleler ARRAY City_name: "İstanbul", mahalleler: "İstanbul"

Dizinler ve fiyatlandırma

Dizinler, uygulamanızın depolama maliyetlerine katkıda bulunur. Dizinler için depolama boyutunun nasıl hesaplandığı hakkında daha fazla bilgi edinmek için Dizin girişi boyutu bölümüne bakın.

Dizin birleştirmeden yararlanma

Cloud Firestore her sorgu için bir dizin kullansa da sorgu başına bir dizin gerektirmez. Cloud Firestore, birden fazla eşitlik (==) deyimi ve isteğe bağlı olarak orderBy ifadesini içeren sorgularda mevcut dizinleri yeniden kullanabilir. Cloud Firestore, basit eşitlik filtreleri için dizinleri birleştirerek daha büyük eşitlik sorguları için gereken birleşik dizinleri oluşturabilir.

Dizin birleştirmeden faydalanabileceğiniz durumları belirleyerek dizine ekleme maliyetlerini azaltabilirsiniz. Örneğin, bir restoran derecelendirme uygulaması için restaurants koleksiyonunu düşünün:

  • restoran

    • hamburger

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

Şimdi, bu uygulamanın aşağıdaki gibi sorgular kullandığını düşünün. Uygulamanın category, city ve editors_pick için eşitlik ifadelerini bir arada kullanırken her zaman artan star_rating düzenine göre sıralama yaptığına dikkat edin:

Web
db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

Her sorgu için bir dizin oluşturabilirsiniz:

Toplama Dizine eklenen alanlar Sorgu kapsamı
restoranlar kategorisi, star_rating Toplama
restoranlar şehir, yıldızlı değerlendirme Toplama
restoranlar kategorisi, şehir, star_rating Toplama
restoranlar kategorisi, şehir, editor_pick, star_rating Toplama

Daha iyi bir çözüm olarak, Cloud Firestore'un eşitlik ifadeleri için dizinleri birleştirme özelliğinden yararlanarak dizin sayısını azaltabilirsiniz:

Toplama Dizine eklenen alanlar Sorgu kapsamı
restoranlar kategorisi, star_rating Toplama
restoranlar şehir, yıldızlı değerlendirme Toplama
restoranlar editörleri_seç, yıldız_derecelendirmesi Toplama

Bu dizin grubu hem daha küçüktür hem de ek bir sorguyu destekler:

Web
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

Dizine ekleme sınırları

Dizinler için aşağıdaki sınırlar geçerlidir. Tüm kotalar ve sınırlar için Kotalar ve Sınırlar bölümüne bakın.

Sınır Ayrıntılar
Bir veritabanı için maksimum birleşik dizin sayısı
Bir veritabanı için maksimum tek alanlı yapılandırma sayısı

Bir alan düzeyinde yapılandırma, aynı alan için birden fazla yapılandırma içerebilir. Örneğin, tek bir alanda dizine ekleme muafiyeti ve aynı alandaki bir TTL politikası, sınıra dahil edilen tek bir alan yapılandırması olarak sayılır.

Her belge için maksimum dizin girişi sayısı

40.000

Belgelerde dizin girişlerinin sayısı, aşağıdakilerin toplamına eşittir:

  • Tek alanlı dizin girişlerinin sayısı
  • Birleşik dizin girişlerinin sayısı

Cloud Firestore'un bir belgeyi ve dizin grubunu nasıl dizin girişine dönüştürdüğünü görmek için dizin girişi sayısıyla ilgili bu örneğe göz atın.

Bileşik dizindeki maksimum alan sayısı 100
Dizin girişinin maksimum boyutu

7,5 KiB

Cloud Firestore'un dizin girişi boyutunu nasıl hesapladığını öğrenmek için dizin girişi boyutu bölümünü inceleyin.

Bir belgenin dizin girişlerinin maksimum toplam boyutu

8 MiB

Belgelerdeki toplam boyut, aşağıdakilerin toplamına eşittir:

  • Bir belgenin tek alanlı dizin girişlerinin toplam boyutu
  • Bir belgenin bileşik dizin girişlerinin toplam boyutu
  • Dizine eklenen alan değerinin maksimum boyutu

    1.500 bayt

    Boyutu 1.500 baytı aşan alan değerleri kısaltılır. Kısaltılmış alan değerleri içeren sorgular tutarsız sonuçlar verebilir.

    Dizine eklemeyle ilgili en iyi uygulamalar

    Çoğu uygulamada, dizinlerinizi yönetmek için otomatik dizine ekleme özelliğini ve hata mesajı bağlantılarını kullanabilirsiniz. Ancak, aşağıdaki durumlarda tek alanlı muafiyetler eklemek isteyebilirsiniz:

    Durum Açıklama
    Geniş dize alanları

    Genellikle sorgulamada kullanmadığınız uzun dize değerleri içeren bir dize alanınız varsa bu alanı dizine eklenmekten muaf tutarak depolama maliyetlerini azaltabilirsiniz.

    Sıralı değerleri olan belgeler içeren bir koleksiyona yüksek yazma hızları

    Zaman damgası gibi, koleksiyondaki belgeler arasında sırayla artan veya azalan bir alanı dizine eklerseniz koleksiyondaki maksimum yazma hızı saniyede 500 yazma işlemi olur. Sıralı değerleri olan alana göre sorgulama yapmıyorsanız bu sınırı atlamak için alanı dizine eklenmekten muaf tutabilirsiniz.

    Örneğin, yazma hızı yüksek olan bir IoT kullanım alanında, zaman damgası alanı olan belgeler içeren bir koleksiyon, saniyede 500 yazma sınırına yaklaşabilir.

    TTL alanları

    TTL (Geçerlilik süresi) politikalarını kullanıyorsanız TTL alanının bir zaman damgası olması gerektiğini unutmayın. TTL alanlarında dizine ekleme varsayılan olarak etkindir ve daha yüksek trafik oranlarında performansı etkileyebilir. En iyi uygulama olarak, TTL alanlarınız için tek alanlı muafiyetler ekleyin.

    Büyük dizi veya eşleme alanları

    Büyük dizi veya eşleme alanları,belge başına 40.000 dizin girişi sınırına yaklaşabilir. Geniş bir diziye veya eşleme alanına dayalı sorgulama yapmıyorsanız dizine ekleme işleminden muaf tutmanız gerekir.

    Birden çok alanda aralık ve eşitsizlik operatörleri içeren sorgular kullanıyorsanız Cloud Firestore sorgularının performansını ve maliyetini optimize etmek için dikkate almanız gereken dizine eklemeyle ilgili dikkat edilmesi gereken noktaları inceleyin

    Dizine ekleme sorunlarının (dizin dağılması, INVALID_ARGUMENT hataları) nasıl çözüleceğine ilişkin daha fazla bilgi için sorun giderme sayfasına göz atın.