Cloud Firestore'da dizinleri yönetin

Cloud Firestore, her sorgu için dizin gerektirerek sorgu performansı sağlar. En temel sorgular için gereken dizinler sizin için otomatik olarak oluşturulur. Cloud Firestore, uygulamanızı kullanıp test ederken uygulamanızın ihtiyaç duyduğu ek dizinleri oluşturmanıza yardımcı olan hata mesajları oluşturur. Bu sayfada, tek alanlı ve birleşik dizinlerinizi nasıl yöneteceğiniz açıklanmaktadır.

Hata mesajıyla eksik dizin oluşturma

Mevcut bir dizinle eşleşmeyen aralık ifadesiyle bileşik sorgu çalıştırmaya çalışırsanız hata alırsınız. Hata mesajı, Firebase konsolunda eksik dizini oluşturmak için doğrudan bir bağlantı içerir.

Oluşturulan bağlantıyı tıklayarak Firebase konsoluna gidin, otomatik olarak doldurulan bilgileri inceleyin ve Oluştur'u tıklayın.

Roller ve izinler

Cloud Firestore'da dizin oluşturmadan önce size aşağıdaki rollerden birinin atandığından emin olun:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Özel roller tanımladıysanız dizin oluşturmak için aşağıdaki izinlerin tümünü atayın:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Firebase konsolunu kullanma

Firebase konsolundan manuel olarak yeni bir dizin oluşturmak için:

Firebase konsolundaki
firestore dizine ekleme arayüzünün resmi

  1. Firebase konsolunun Cloud Firestore bölümüne gidin.
  2. Dizinler sekmesine gidin ve Dizin Ekle'yi tıklayın.
  3. Koleksiyon adını girin ve dizini sıralamak istediğiniz alanları belirleyin.
  4. Oluştur'u tıklayın.

Dizin alanları, alan yollarıyla ilgili kısıtlamalara uygun olmalıdır.

Dizinlerin oluşturulması sorgunun boyutuna bağlı olarak birkaç dakika sürebilir. Oluşturduktan sonra dizinlerinizi ve durumlarını Bileşik Dizinler bölümünde görebilirsiniz. Geliştirme süreci devam ediyorsa Firebase konsolunda bir bina durum çubuğu bulunur.

Dizinleri kaldır

Bir dizini silmek için:

  1. Firebase konsolunun Cloud Firestore bölümüne gidin.
  2. Dizinler sekmesini tıklayın.
  3. Fare imlecini, silmek istediğiniz dizinin üzerine getirin ve içerik menüsünden Sil'i seçin.
  4. Uyarıda Sil'i tıklayarak uyarıyı silmek istediğinizi onaylayın.

Firebase CLI'ı kullanma

Dizinleri Firebase CLI ile de dağıtabilirsiniz. Başlamak için proje dizininizde firebase init firestore komutunu çalıştırın. Kurulum sırasında Firebase CLI, varsayılan dizinleri doğru biçimde içeren bir JSON dosyası oluşturur. Dosyayı düzenleyerek daha fazla dizin ekleyin ve firebase deploy komutuyla dağıtın.

Yalnızca Cloud Firestore dizinlerini ve kurallarını dağıtmak için --only firestore işaretini ekleyin.

Firebase konsolunu kullanarak dizinlerde düzenleme yaparsanız yerel dizin dosyanızı da güncellediğinizden emin olun. JSON dizini tanımına bakın.

Terraform kullan

Veritabanında dizin oluşturma

Cloud Firestore veritabanı, tek alanlı bir dizin veya birleşik dizin içerebilir. Veritabanınız için bir dizin oluşturmak üzere Terraform yapılandırma dosyasını düzenleyebilirsiniz.

Tek alanlı dizin

Aşağıdaki örnek Terraform yapılandırma dosyası, chatrooms koleksiyonundaki name alanında tek alanlı bir dizin oluşturur:

firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • project-id yerine proje kimliğinizi yazın. Proje kimlikleri benzersiz olmalıdır.
  • database-id değerini veritabanı kimliğinizle değiştirin.

Bileşik dizin

Aşağıdaki örnek Terraform yapılandırma dosyası, chatrooms koleksiyonundaki name alanı ile description alanının bir kombinasyonu için bileşik dizin oluşturur:

firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"
  database = "database-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • project-id yerine proje kimliğinizi yazın. Proje kimlikleri benzersiz olmalıdır.
  • database-id değerini veritabanı kimliğinizle değiştirin.

Dizin oluşturma süresi

Dizin oluşturmak için Cloud Firestore'un dizini ayarlaması ve ardından dizini mevcut verilerle doldurması gerekir. Dizin oluşturma süresi, kurulum süresi ile doldurma süresinin toplamıdır:

  • Dizin oluşturmak birkaç dakika sürer. Bir dizin için minimum derleme süresi, veritabanı boş olsa bile birkaç dakikadır.

  • Doldurma süresi, mevcut verilerin ne kadarının yeni dizine ait olduğuna bağlıdır. Dizin tanımıyla eşleşen ne kadar çok alan değeri varsa dizinin doldurulması o kadar uzun sürer.

Dizin derlemeleri uzun süreli işlemlerdir.

Bir dizin derlemesi başlattığınızda, Cloud Firestore işleme benzersiz bir ad atar. İşlem adlarının başında projects/[PROJECT_ID]/databases/(default)/operations/ bulunur. Örneğin:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Ancak describe komutu için işlem adı belirtirken öneki çıkarabilirsiniz.

Tüm uzun süreli işlemleri listeleme

Uzun süreli işlemleri listelemek için gcloud firestore Operations list komutunu kullanın. Bu komut, devam eden ve yakın zamanda tamamlanan işlemleri listeler. İşlemler, tamamlandıktan sonra birkaç gün boyunca listelenir:

gcloud firestore operations list

İşlem durumunu kontrol et

Tüm uzun süreli işlemleri listelemek yerine tek bir işlemin ayrıntılarını listeleyebilirsiniz:

gcloud firestore operations describe operation-name

Tamamlanma süresini tahmin etme

İşleminiz çalışırken, işlemin genel durumu için state alanındaki değere bakın.

Uzun süreli bir işlemin durumuna yönelik bir istek de workEstimated ve workCompleted metriklerini döndürür. Bu metrikler, doküman sayısı için döndürülür. workEstimated, bir işlemin işleyeceği tahmini toplam belge sayısını gösterir. workCompleted, şu ana kadar işlenen dokümanların sayısını gösterir. İşlem tamamlandıktan sonra workCompleted, gerçekten işlenen toplam belge sayısını yansıtır. Bu sayı, workEstimated değerinden farklı olabilir.

İlerleme tahmini için workCompleted değerini workEstimated değerine bölün. Tahmin, gecikmeli istatistiklerin toplanmasına bağlı olduğu için yanlış olabilir.

Örneğin, bir dizin derlemesinin ilerleme durumu aşağıdaki gibidir:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

Bir işlem tamamlandığında işlem açıklamasında "done": true yer alır. İşlemin sonucu için state alanındaki değere bakın. done alanı yanıtta ayarlanmamışsa değeri false olur. Devam eden işlemler için done değerinin mevcut olmasına güvenmeyin.

Dizin oluşturma hataları

Bileşik dizinleri ve tek alanlı dizin muafiyetlerini yönetirken dizin oluşturma hatalarıyla karşılaşabilirsiniz. Cloud Firestore, dizine eklediği verilerle ilgili bir sorunla karşılaşırsa dizine ekleme işlemi başarısız olabilir. Bu durum genellikle dizin sınırına ulaştığınız anlamına gelir. Örneğin, işlem belge başına maksimum dizin girişi sayısına ulaşmış olabilir.

Dizin oluşturma işlemi başarısız olursa konsolda hata mesajı gösterilir. Herhangi bir dizin sınırına ulaşmadığınızı doğruladıktan sonra dizin işleminizi yeniden deneyin.