Dizinleri yönet

Bu sayfada, dizinlerinizi nasıl yöneteceğiniz açıklanmıştır. Dizinler hakkında daha fazla bilgi edinmek için Dizinlere genel bakış başlıklı makaleyi inceleyin.

Başlamadan önce

Cloud Firestore içinde dizin oluşturabilmek için aşağıdaki rollerden birine atanmış olmanız gerekir:

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

Rol vermek için Tek bir rol verme başlıklı makaleyi inceleyin. Cloud Firestore rolleri ve ilişkili izinler hakkında daha fazla bilgi için Önceden tanımlanmış roller başlıklı makaleyi inceleyin.

Ö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

Dizin oluşturma

Dizin oluşturmak için aşağıdaki adımları uygulayın:

MongoDB API

Dizin oluşturmak için createIndex() yöntemini kullanın. Örneğin:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • db.runCommand() ile dizin oluşturma da en fazla bir dizinle desteklenir.

      db.runCommand({"createIndexes":"restaurant", "indexes": [{"key": {"cuisine":1}, "name": "cuisine_index"}]})
      

Aşağıdaki sınırlamalara dikkat edin:

  • İstek başına yalnızca bir dizin oluşturabilirsiniz. db.collection.createIndexes() desteklenmiyor.
  • MongoDB API ile dizin oluşturma işlemine ait denetleme günlükleri, google.firestore.admin.v1.FirestoreAdmin.CreateIndex yöntem adını kullanır.
  • Desteklenen dizin seçenekleri için dizinler ve dizin özellikleri bölümüne bakın.
Firebase konsolu
  1. Firebase konsolunda Firestore Database sayfasına gidin.

    Firestore Veritabanı'na git

  2. Veritabanları listesinden bir veritabanı seçin.
  3. Indexes (Dizinler) sekmesinde Create Index'i (Dizin Oluştur) tıklayın.
  4. Koleksiyon kimliği girin.
  5. Bir veya daha fazla alan yolu ekleyin ve her biri için bir dizin seçeneği belirleyin.
  6. Seyrek olmayan veya seyrek alan varlığı seçeneklerinden birini belirleyin.
  7. İsteğe bağlı olarak çoklu anahtar dizini seçeneğini ayarlayabilirsiniz.
  8. Oluştur'u tıklayın.
  9. Yeni dizininiz, dizinler listesinde gösterilir ve Cloud Firestore dizininizi oluşturmaya başlar. Dizininiz oluşturulduğunda dizinin yanında yeşil bir onay işareti görürsünüz. Dizin oluşturulmazsa olası nedenler için Dizin oluşturma hataları bölümüne bakın.
gcloud CLI

Dizin oluşturmak için gcloud firestore indexes composite create komutunu kullanın. api-scope değerini mongodb-compatible-api olarak ayarlayın.

gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION \
--field-config=FIELD_CONFIGURATION \
--query-scope=collection-group \
--density=dense \
--api-scope=mongodb-compatible-api

Aşağıdakini değiştirin:

  • DATABASE_ID: Veritabanı kimliği.
  • COLLECTION: Koleksiyon adı.
  • FIELD_CONFIGURATION: alan yapılandırması. Her alan için --field-config=field-path= ekleyin. Örneğin:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Bu alanları yapılandırma hakkında daha fazla bilgi için --field-config başlıklı makaleyi inceleyin.

Seyrek dizin oluşturmak için --density=sparse-any değerini ayarlayın.

Çok anahtarlı dizin oluşturmak için --multikey işaretini ekleyin.

Benzersiz bir dizin oluşturmak için --unique işaretini ekleyin.

Terraform

google_firestore_index kaynağını kullanın ve api_scope değerini MONGODB_COMPATIBLE_API, query_scope değerini ise COLLECTION_GROUP olarak ayarlayın.

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  api_scope   = "MONGODB_COMPATIBLE_API"
  query_scope = "COLLECTION_GROUP"

  // You can include multiple field blocks
  fields {
    field_path = "FIELD_PATH"
    order      = "ORDER"
  }

  // Optional
  multikey = true
  density  = "DENSITY"
}

Aşağıdakini değiştirin:

  • DATABASE_ID: Seçtiğiniz veritabanının veritabanı kimliği
  • COLLECTION: Dizine eklenecek koleksiyonun adı
  • FIELD_PATH: Dizine eklenecek alanın adı
  • ORDER: ASCENDING veya DESCENDING değerlerinden biri
  • DENSITY: SPARSE_ANY veya DENSE değerlerinden biri

Metin dizini oluşturma

Bir koleksiyondaki belirli dizeler için metin araması yapmak istiyorsanız metin dizini oluşturun.

Koleksiyonunuz için metin dizini oluşturmak üzere aşağıdaki adımları tamamlayın:

MongoDB API

Metin dizini oluşturmak için createIndex() yöntemini kullanın. Aşağıdaki örnekte, cities koleksiyonuna country veya food alanları doldurulmuş bir doküman yazıldığında bu alanlar arama amacıyla dizine eklenir.

db.cities.createIndex({"country": "text", "food": "text"})

Dizine eklenecek alan bir dize veya dize dizisi olmalıdır. Dizi dizinleri, arama dizinine eklenmez. Sonuç olarak, a.1.b dizine eklendiğinde something, {a: {1: {b: something}}} içinde dizine eklenir ancak {a: [one, {b: something}]} içinde dizine eklenmez.

db.runCommand() ile de dizin oluşturabilirsiniz. Koleksiyon başına yalnızca bir metin dizini oluşturabilirsiniz ancak bir db.runCommand() içinde farklı türlerde birden fazla dizin oluşturabilirsiniz. Aşağıdaki örnekte, metin dizini oluşturmak için db.runCommand() kullanılmıştır:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text" },
      name: "country_text_food_text"
    }
  ]
})

Varsayılan dil belirtme

İsterseniz varsayılan bir dil veya dokümanınızda varsayılan dili içerecek bir alan yolu da belirtebilirsiniz.

Aşağıdaki örnekte myLanguageField, language_override olarak belirtilmiştir. cities koleksiyonundaki bir doküman myLanguageField adlı bir alan içerdiğinde, bu alanın değeri, ilgili doküman için country alanını dizine ekleme dilini belirlemek amacıyla kullanılır. Bu değer, french olan varsayılan dili geçersiz kılar.

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • Dili, uzun adıyla (english) veya iki harfli ISO dil koduyla (en) girebilirsiniz.
  • Varsayılan dil ayarlanmazsa Cloud Firestore varsayılan olarak İngilizceye ayarlanır.
  • Dil geçersiz kılma alanı, üst düzey bir alan olmalıdır. Boş bırakılırsa dil geçersiz kılma alanı varsayılan olarak language değerine ayarlanır.
  • Varsayılan dili null karakterine ayarlarsanız Cloud Firestore, dil geçersiz kılma olarak herhangi bir alan kullanmaz.

Desteklenen dillerin listesini görmek için genişletin

Dil Kodu Dil Adı
"und" Otomatik algılama
"af" Afrikaanca
"ak" Akan
"sq" Arnavutça
"am" Amharca
"ar" Arapça
"hy" Ermenice
"az" Azerice
"eu" Baskça
"be" Belarusça
"bn" Bangla
"bs" Boşnakça
"bg" Bulgarca
"my" Burmaca
"ca" Katalanca
"ceb" Sabuanca
"chr" Çerokice
"zh" Çince
"zh-Hant" Çince_Geleneksel
"saat" Hırvatça
"cs" Çek dili
"da" Danca
"nl" Felemenkçe
"tr" İngilizce
"eo" Esperanto
"et" Estonca
"fil" Filipince
"fi" Fince
"fr-FR" Fransızca
"gl" Galiçyaca
"ka" Gürcüce
"de" Almanca
"el" Yunanca
"gu" Gujarati
"ht" Haiti_Kreolcesi
"ha" Hausaca
"haw" Hawai Usulü
"iw" İbranice
"selam" Hintçe
"hmn" Hmong
"hu" Macarca
"is" İzlandaca
"ig" İgbo dili
"id" Endonezce
"ga" İrlandaca
"it" Italian
"ja" Japonca
"jv" Cava dili
"kn" Kannada
"kk" Kazakça
"km" Kmerce
"ko" Korece
"lo" Laoca
"la" Latince
"lv" Letonca
"lt" Litvanca
"lb" Luxembourgish
"mk" Makedonca
"mg" Malgaşça
"ms" Malayca
"ml" Malayalam
"mt" Maltaca
"mi" Maori
"mr" Marathi
"mfe" Morisyen
"mn" Moğolca
"sr-ME" Sırpça_Karadağ
"ne" Nepalce
"hayır" Norveççe
"ny" Nyanja
"veya" Oriya
"fa" Farsça
"pl" Lehçe
"pt-BR" Portekizce_Brezilya
"pt-PT" Portekizce_Portekiz
"pa" Punjabi
"ro" Rumence
"ru" Rusça
"gd" İskoç Galcesi
"sr" Sırpça
"st" Güney Sotho dili
"si" Seylanca
"sk" Slovakça
"sl" Slovence
"so" Somalice
"es" İspanyolca
"su" Sundaca
"sw" Swahili
"sv" İsveççe
"tg" Tacikçe
"ta" Tamilce
"te" Telugu dili
"th" Tayca
"tr" Türkçe
"uk" Ukraynaca
"ur" Urduca
"uz" Özbekçe
"vi" Vietnamca
"cy" Galce
"yi" Yidiş
"yo" Yorubaca
"zu" Zulu

Metin dizinini bölümlere ayırma

Sorguları belirli bir alan değerine göre filtreleyebilmek için dizininizi bir alan kullanarak da bölümleyebilirsiniz. Bu yapılandırma, sorguladığınız dizinde her zaman belirli bir alanın filtrelenmesi gerekiyorsa daha yüksek performanslı sorgular çalıştırmanıza olanak tanır.

Bölüm içeren bir dizin oluşturmak için firestoreOptions alanını aşağıdaki gibi yapılandırın:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text"},
      name: "country_text_food_text"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

Nerede:

  • PARTITIONED_FIELD, bölüm için kullanılan alanın adıdır. Bu değer bir dize olmalı ve üst düzey bir alana başvurmalıdır. Bölümlenmiş bir dizinde sorgu çalıştırdığınızda sonuçları bu alanın değerine göre filtreleyebilirsiniz. Örneğin, city kullanarak dizininizi bölümlere ayırabilirsiniz. Metin dizininizde bir city alanı tanımlanmışsa kullanıcılar belirli bir şehir için sorgu yapabilir.

    Bölüm yalnızca bir alan olmalıdır. Bir dizini bölümlere ayırırsanız yalnızca bölümlere ayrılmış alanın belirtildiği sorguları çalıştırabilirsiniz.

Sınırlamalar

  • İstek başına yalnızca bir dizin oluşturabilirsiniz.
  • MongoDB API ile dizin oluşturma için denetleme günlükleri, google.firestore.admin.v1.FirestoreAdmin.CreateIndex yöntem adını kullanır.
  • Desteklenen dizin seçenekleri için dizinler ve dizin özellikleri başlıklı makaleyi inceleyin.

Firebase konsolu

  1. Firebase konsolunda Firestore Veritabanı sayfasına gidin.

    Firestore Veritabanı'na git

  2. Veritabanları listesinden bir veritabanı seçin.

  3. Indexes (Dizinler) sekmesinde Create Index'i (Dizin Oluştur) tıklayın.

  4. Koleksiyon kimliği girin.

  5. Bir veya daha fazla alan yolu ekleyin ve her biri için bir dizin seçeneği belirleyin.

  6. Oluştur'u tıklayın.

  7. Yeni dizininiz, dizinler listesinde gösterilir ve MongoDB uyumlu işlemler dizininizi oluşturmaya başlar. Dizininiz oluşturulduğunda dizinin yanında yeşil bir onay işareti görürsünüz. Dizin oluşturulmazsa olası nedenler için Dizin oluşturma hataları bölümüne bakın.

gcloud CLI

Metin dizini oluşturmak için gcloud firestore indexes composite create komutunu kullanın. --api-scope değerini mongodb-compatible-api olarak ayarlayın.

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"text-spec": {"index-specs": [{"index-type": "tokenized", "match-type": "match-globally"}]}}' \
  --api-scope=mongodb-compatible-api \
  --search-index-options=text-language=en \
  --async

Aşağıdakini değiştirin:

  • DATABASE_ID: Veritabanı kimliği.
  • COLLECTION_GROUP: Dizine eklenecek koleksiyonun kimliği.
  • FIELD_NAME: Dizine eklenecek alanın adı.

--async işareti, dizin oluşturma işlemini arka planda çalıştırır.

2dsphere dizini oluşturma

Coğrafi sorgular gerçekleştirmek ve belirli bir boylam ve enlemden belirli bir aralıkta bulunan belgeleri aramak için 2dsphere dizini oluşturun.

Koleksiyonunuz için bir 2dsphere dizini oluşturmak üzere aşağıdaki adımları tamamlayın:

MongoDB API

Dizin oluşturmak için createIndex() yöntemini kullanın. Örneğin:

db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})

db.runCommand() ile dizin oluşturma da en fazla bir dizinle desteklenir:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
    }
  ]
})

2dsphere dizinini bölme

Sorguları belirli bir alan değerine göre filtreleyebilmek için dizininizi bir alan kullanarak da bölümleyebilirsiniz. Bu yapılandırma, sorguladığınız dizinde her zaman belirli bir alanın filtrelenmesi gerekiyorsa daha yüksek performanslı sorgular çalıştırmanıza olanak tanır.

Bölüm içeren bir dizin oluşturmak için firestoreOptions alanını aşağıdaki gibi yapılandırın:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

Nerede:

  • PARTITIONED_FIELD, bölüm için kullanılan alanın adıdır. Bölümlenmiş bir dizinde sorgu çalıştırdığınızda sonuçları bu alanın değerine göre filtreleyebilirsiniz. Örneğin, dizininizde bölgesel konumlar için bir region alanı varsa kullanıcıların kendi bölgelerindeki restoranları sorgulayabilmesi için dizininizi region kullanarak bölümlere ayırabilirsiniz.

    Bir dizini bölümlere ayırırsanız yalnızca bölümlere ayrılmış alanın belirtildiği sorguları çalıştırabilirsiniz.

Sınırlamalar

  • İstek başına yalnızca bir dizin oluşturabilirsiniz.
  • MongoDB API ile dizin oluşturma için denetleme günlükleri, google.firestore.admin.v1.FirestoreAdmin.CreateIndex yöntem adını kullanır.
  • Desteklenen dizin seçenekleri için dizinler ve dizin özellikleri başlıklı makaleyi inceleyin.

Firebase konsolu

  1. Firebase konsolunda Firestore Veritabanı sayfasına gidin.

    Firestore Veritabanı'na git

  2. Veritabanları listesinden bir veritabanı seçin.

  3. Indexes (Dizinler) sekmesinde Create Index'i (Dizin Oluştur) tıklayın.

  4. Koleksiyon kimliği girin.

  5. Bir veya daha fazla alan yolu ekleyin ve her biri için bir dizin seçeneği belirleyin.

  6. Oluştur'u tıklayın.

  7. Yeni dizininiz, dizinler listesinde gösterilir ve MongoDB uyumlu işlemler dizininizi oluşturmaya başlar. Dizininiz oluşturulduğunda dizinin yanında yeşil bir onay işareti görürsünüz. Dizin oluşturulmazsa olası nedenler için Dizin oluşturma hataları bölümüne bakın.

gcloud CLI

2dsphere dizini oluşturmak için gcloud firestore indexes composite create komutunu kullanın. --api-scope değerini mongodb-compatible-api olarak ayarlayın.

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"geo-spec": {}}' \
  --api-scope=mongodb-compatible-api \
  --async

Aşağıdakini değiştirin:

  • DATABASE_ID: Veritabanı kimliği.
  • COLLECTION_GROUP: Dizine eklenecek koleksiyonun kimliği.
  • FIELD_NAME: Dizine eklenecek alanın adı.

--async işareti, dizin oluşturma işlemini arka planda çalıştırır.

Dizini silme

Bir dizini silmek için aşağıdaki adımları uygulayın:

MongoDB API

Bir dizini silmek için dropIndex() yöntemini kullanın. Örneğin:

Dizin adını kullanarak dizin silme

db.restaurants.dropIndex("cuisine_index")

Dizin tanımını kullanarak dizin silme

db.restaurants.dropIndex({"cuisine" : 1})
Firebase konsolu
  1. Firebase konsolunda Firestore Database sayfasına gidin.

    Firestore Veritabanı'na git

  2. Veritabanları listesinden bir veritabanı seçin.
  3. Dizinler sekmesini tıklayın.
  4. Dizin listesinde, silmek istediğiniz dizin için Diğer düğmesinden Sil'i seçin.
  5. Delete Index'i (Dizini Sil) tıklayın.
gcloud CLI
  1. Dizinin adını bulmak için gcloud firestore indexes composite list komutunu kullanın.

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    DATABASE_ID yerine veritabanı kimliğini girin.

  2. Dizini silmek için gcloud firestore indexes composite delete komutunu kullanın.

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    Aşağıdakini değiştirin:

    • INDEX_NAME: bir dizinin adı
    • DATABASE_ID: veritabanı kimliği

Dizin oluşturma süresi

Dizin oluşturmak için Cloud Firestore, dizini oluşturmalı ve ardından dizin girişlerini mevcut verilerle doldurmalıdır. Dizin oluşturmak için gereken süre, aşağıdakilere göre belirlenir:

  • Boş bir veritabanı için bile dizin oluşturma süresi en az birkaç dakikadır.

  • Dizin girişlerini doldurmak için gereken süre, yeni dizine ait mevcut veri miktarına bağlıdır. Dizin tanımıyla eşleşen alan değeri sayısı ne kadar fazlaysa dizin girişlerinin doldurulması o kadar uzun sürer.

Uzun süreli işlemleri yönetme

Dizin derlemeleri uzun süreli işlemlerdir. Aşağıdaki bölümlerde, dizinler için uzun süreli işlemlerle nasıl çalışılacağı açıklanmaktadır.

Dizin oluşturmaya başladıktan sonra Cloud Firestore, işleme benzersiz bir ad atar. İşlem adlarının önüne projects/PROJECT_ID/databases/DATABASE_ID/operations/ eklenir. Örneğin:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

describe komutu için işlem adı belirtirken ön eki atlayabilirsiniz.

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

Faaliyet durumunu kontrol etme

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üresi tahmin ediliyor

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

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

Bir işlemin ilerleme durumunu tahmin etmek için workCompleted değerini workEstimated değerine bölün.

Aşağıda, dizin oluşturma sürecine dair bir örnek verilmiştir:

{
  "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ı "done": true değerini içerir. İşlemin sonucu için state alanının değerine bakın. Yanıtta done alanı ayarlanmamışsa işlem tamamlanmamıştır.