Indeks

Setiap kueri Firestore dalam mode Datastore menghitung hasilnya menggunakan satu atau beberapa indeks yang berisi kunci entity dalam urutan yang ditentukan oleh properti indeks dan, secara opsional, ancestor entity. Indeks diperbarui untuk mencerminkan setiap perubahan yang dibuat aplikasi pada entity-nya, sehingga hasil yang benar dari semua kueri tersedia tanpa perlu komputasi lebih lanjut.

Ada dua jenis indeks:

Indeks bawaan
Secara default, database mode Datastore secara otomatis menentukan indeks untuk setiap properti dari setiap jenis entity. Indeks properti tunggal ini cocok untuk jenis kueri sederhana.
Indeks komposit
Indeks komposit mengindeks beberapa nilai properti per entity yang diindeks. Indeks komposit mendukung kueri yang kompleks dan ditentukan dalam file konfigurasi indeks (index.yaml).

Jenis-jenis indeks akan dibahas secara lebih mendetail nanti.

Definisi dan struktur indeks

Indeks ditentukan pada daftar properti dari jenis entity tertentu, dengan urutan yang sesuai (menaik atau menurun) untuk setiap properti. Untuk digunakan dengan kueri ancestor, indeks juga dapat menyertakan ancestor entity secara opsional.

Indeks berisi entri untuk setiap properti yang disebutkan dalam definisi indeks. Setiap entri indeks mewakili entitas yang merupakan hasil potensial untuk kueri berdasarkan indeks. Entity disertakan dalam indeks hanya jika memiliki nilai terindeks yang ditetapkan untuk setiap properti yang digunakan dalam indeks; jika definisi indeks mengacu pada properti yang nilai entity-nya tidak ada, entity tersebut tidak akan muncul dalam indeks, sehingga tidak akan pernah ditampilkan sebagai hasil untuk kueri apa pun berdasarkan indeks.

Indeks komposit diurutkan pertama berdasarkan ancestor dan kemudian berdasarkan nilai properti, dalam urutan yang ditentukan dalam definisi indeks. Berdasarkan pemahaman ini, Anda dapat membuat indeks sempurna yang memungkinkan pembuatan kueri yang efisien.

Konfigurasi indeks

Firestore dalam mode Datastore menyediakan indeks bawaan atau otomatis untuk kueri dengan bentuk berikut:

  • Kueri Kindless hanya menggunakan ancestor dan filter kunci
  • Kueri yang hanya menggunakan filter ancestor dan kesetaraan
  • Kueri yang hanya menggunakan filter ketidaksetaraan (yang dibatasi pada satu properti)
  • Kueri yang hanya menggunakan filter ancestor, filter kesetaraan pada properti, dan filter ketidaksetaraan pada kunci
  • Kueri tanpa filter dan hanya satu tata urutan pada properti, baik menaik maupun menurun

Sebagai contoh, secara default, database mode Datastore secara otomatis menentukan sebelumnya dua indeks properti tunggal untuk setiap properti dari setiap jenis entity, satu dalam urutan menaik dan satu dalam urutan menurun. Jika tidak ingin database Anda mempertahankan indeks untuk suatu properti, kecualikan properti tersebut dari indeks Anda. Perhatikan bahwa mengecualikan properti akan menghapusnya dari indeks komposit apa pun.

Indeks bawaan cukup untuk melakukan banyak kueri sederhana, seperti kueri khusus kesetaraan dan kueri ketidaksetaraan sederhana.

Indeks bawaan tidak muncul di halaman Indexes pada Konsol Google Cloud.

Untuk kueri yang lebih kompleks, aplikasi harus menentukan indeks komposit, atau manual. Indeks komposit diperlukan untuk kueri dengan bentuk berikut:

  • Kueri dengan filter ancestor dan ketidaksetaraan
  • Kueri dengan satu atau beberapa filter ketidaksetaraan di properti dan satu atau beberapa filter kesetaraan di properti lainnya
  • Kueri dengan tata urutan pada kunci dalam urutan menurun
  • Kueri dengan beberapa tata urutan
  • Kueri dengan satu atau beberapa filter dan satu atau beberapa tata urutan

Indeks komposit ditentukan di file konfigurasi indeks aplikasi (index.yaml). (Indeks bawaan tidak dimuat dalam file konfigurasi indeks.)

Indeks komposit terdiri dari beberapa properti dan mengharuskan setiap properti individual tidak dikecualikan dari indeks Anda.

Indeks komposit dapat dilihat di halaman Indeks di Konsol Google Cloud. Anda tidak dapat menggunakan konsol Google Cloud untuk membuat atau mengupdate indeks komposit.

Jika aplikasi mencoba melakukan kueri yang tidak dapat dijalankan dengan indeks yang tersedia (baik bawaan maupun ditetapkan dalam file konfigurasi indeks), kueri akan gagal.

API mode Datastore secara otomatis menyarankan indeks yang sesuai untuk sebagian besar aplikasi. Bergantung pada penggunaan database mode Datastore Anda dan ukuran serta bentuk data Anda, penyesuaian manual pada indeks Anda mungkin diperlukan. Misalnya, menulis entity dengan beberapa nilai properti dapat menyebabkan indeks yang meledak dengan biaya penyimpanan yang tinggi dan meningkatkan latensi tulis.

Emulator Datastore dapat membantu mempermudah pengelolaan file konfigurasi indeks Anda. Alih-alih gagal menjalankan kueri yang memerlukan indeks dan tidak memilikinya, emulator Datastore dapat menghasilkan konfigurasi indeks yang akan memungkinkan kueri berhasil. Jika pengujian lokal aplikasi Anda menjalankan setiap kemungkinan kueri yang akan dikeluarkan aplikasi, dengan menggunakan setiap kombinasi filter dan tata urutan, entri yang dihasilkan akan mewakili rangkaian indeks lengkap. Jika pengujian Anda tidak menggunakan setiap kemungkinan formulir kueri, Anda dapat meninjau dan menyesuaikan file konfigurasi indeks sebelum memperbarui indeks.

Anda dapat mempelajari index.yaml lebih lanjut di Konfigurasi Indeks.

Men-deploy atau menghapus indeks

Setelah selesai memodifikasi file konfigurasi indeks, jalankan perintah gcloud datastore indexes create untuk menempatkan indeks ke dalam layanan. Pelajari lebih lanjut di memperbarui indeks Anda.

Jika sebelumnya Anda men-deploy indeks yang tidak lagi diperlukan, Anda dapat menghapus indeks yang tidak digunakan.

Biaya penyimpanan dan latensi tulis

Indeks berkontribusi pada biaya penyimpanan Anda. Ukuran entri indeks menjelaskan pengaruh indeks bawaan dan komposit terhadap ukuran penyimpanan database Anda. Anda dapat menggunakan Firestore dalam statistik mode Datastore untuk melihat informasi lebih lanjut tentang entri indeks dan ukuran penyimpanan indeks.

Indeks juga berkontribusi pada latensi tulis. Saat memperbarui nilai properti, database juga memperbarui setiap indeks terkait. Semakin banyak indeks yang perlu diupdate database, semakin lama waktu yang dibutuhkan operasi.

Anda dapat mengurangi biaya penyimpanan dan meningkatkan performa tulis dengan menghapus indeks yang tidak digunakan dan mengecualikan properti dari pengindeksan. Tindakan ini juga mencegah kegagalan operasi karena batas indeks.

Indeks dan properti

Berikut adalah beberapa pertimbangan khusus yang perlu diingat tentang indeks dan kaitannya dengan properti entity Anda:

Properti dengan jenis nilai campuran

Jika dua entity memiliki properti dengan nama yang sama tetapi jenis nilai yang berbeda, indeks properti akan mengurutkan entity terlebih dahulu menurut jenis nilai, lalu menurut pengurutan sekunder yang sesuai untuk setiap jenis. Misalnya, jika dua entity masing-masing memiliki properti bernama age, satu dengan nilai bilangan bulat dan satu lagi dengan nilai string, entity dengan nilai bilangan bulat selalu mendahului entitas dengan nilai string saat diurutkan berdasarkan properti age, terlepas dari nilai properti itu sendiri.

Hal ini perlu diperhatikan terutama dalam kasus bilangan bulat dan angka floating point, yang diperlakukan sebagai jenis terpisah oleh mode Datastore. Karena semua bilangan bulat diurutkan sebelum semua float, properti dengan nilai bilangan bulat 38 diurutkan sebelum bilangan bulat dengan nilai floating point 37.5.

Properti yang dikecualikan

Jika menyadari bahwa Anda tidak perlu memfilter atau mengurutkan properti tertentu, Anda dapat memberi tahu database mode Datastore Anda agar tidak mempertahankan entri indeks untuk properti tersebut dengan mengecualikannya dari indeks. Hal ini dapat menurunkan biaya menjalankan aplikasi Anda dengan mengurangi ukuran penyimpanan yang diperlukan untuk entri indeks. Tindakan ini juga dapat meningkatkan latensi tulis. Entitas dengan properti yang dikecualikan berperilaku seolah-olah properti tersebut tidak ditetapkan: kueri dengan filter atau tata urutan di properti yang dikecualikan tidak akan pernah cocok dengan entitas tersebut.

Properti description dalam contoh berikut dikecualikan dari indeks:

C#

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C# Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Entity task = new Entity()
{
    Key = _db.CreateKeyFactory("Task").CreateKey("sampleTask"),
    ["category"] = "Personal",
    ["created"] = new DateTime(1999, 01, 01, 0, 0, 0, DateTimeKind.Utc),
    ["done"] = false,
    ["priority"] = 4,
    ["percent_complete"] = 10.0,
    ["description"] = new Value()
    {
        StringValue = "Learn Cloud Datastore",
        ExcludeFromIndexes = true
    },
};

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

type Task struct {
	Category        string
	Done            bool
	Priority        int
	Description     string `datastore:",noindex"`
	PercentComplete float64
	Created         time.Time
}
task := &Task{
	Category:        "Personal",
	Done:            false,
	Priority:        4,
	Description:     "Learn Cloud Datastore",
	PercentComplete: 10.0,
	Created:         time.Now(),
}

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Entity task =
    Entity.newBuilder(taskKey)
        .set("category", "Personal")
        .set("created", Timestamp.now())
        .set("done", false)
        .set("priority", 4)
        .set("percent_complete", 10.0)
        .set(
            "description",
            StringValue.newBuilder("Learn Cloud Datastore").setExcludeFromIndexes(true).build())
        .build();

Node.js

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

const task = [
  {
    name: 'category',
    value: 'Personal',
  },
  {
    name: 'created',
    value: new Date(),
  },
  {
    name: 'done',
    value: false,
  },
  {
    name: 'priority',
    value: 4,
  },
  {
    name: 'percent_complete',
    value: 10.0,
  },
  {
    name: 'description',
    value: 'Learn Cloud Datastore',
    excludeFromIndexes: true,
  },
];

PHP

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API PHP Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

$task = $datastore->entity(
    $key,
    [
        'category' => 'Personal',
        'created' => new DateTime(),
        'done' => false,
        'priority' => 4,
        'percent_complete' => 10.0,
        'description' => 'Learn Cloud Datastore'
    ],
    ['excludeFromIndexes' => ['description']]
);

Python

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import datastore

# For help authenticating your client, visit
# https://cloud.google.com/docs/authentication/getting-started
client = datastore.Client()

key = client.key("Task")
task = datastore.Entity(key, exclude_from_indexes=("description",))
task.update(
    {
        "category": "Personal",
        "description": "Learn Cloud Datastore",
        "created": datetime.datetime.now(tz=datetime.timezone.utc),
        "done": False,
        "priority": 4,
        "percent_complete": 10.5,
    }
)
client.put(task)

Ruby

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Ruby Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

task = datastore.entity "Task" do |t|
  t["category"] = "Personal"
  t["created"] = Time.now
  t["done"] = false
  t["priority"] = 4
  t["percent_complete"] = 10.0
  t["description"] = "Learn Cloud Datastore"
  t.exclude_from_indexes! "description", true
end

GQL

Tidak Berlaku

Kueri dalam contoh berikut tidak akan menampilkan hasil apa pun jika properti description dikecualikan:

C#

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C# Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Query query = new Query("Task")
{
    Filter = Filter.Equal("description", "Learn Cloud Datastore")
};

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

query := datastore.NewQuery("Tasks").
	FilterField("Description", "=", "A task description")

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Query<Entity> query =
    Query.newEntityQueryBuilder()
        .setKind("Task")
        .setFilter(PropertyFilter.eq("description", "A task description"))
        .build();

Node.js

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

const query = datastore
  .createQuery('Task')
  .filter(new PropertyFilter('description', '=', 'A task description.'));

PHP

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API PHP Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

$query = $datastore->query()
    ->kind('Task')
    ->filter('description', '=', 'A task description.');

Python

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import datastore

# For help authenticating your client, visit
# https://cloud.google.com/docs/authentication/getting-started
client = datastore.Client()

query = client.query(kind="Task")
query.add_filter(filter=PropertyFilter("description", "=", "Learn Cloud Datastore"))

Ruby

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Ruby Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

query = datastore.query("Task")
                 .where("description", "=", "A task description.")

GQL


# Will not return any results!
SELECT * FROM Task WHERE description = 'A task description.'

Anda nanti dapat mengubah properti kembali menjadi diindeks.

Namun, perhatikan bahwa mengubah properti dari dikecualikan menjadi diindeks tidak memengaruhi entitas yang ada yang mungkin telah dibuat sebelum perubahan. Pemfilteran kueri pada properti tidak akan menampilkan entitas yang ada, karena entitas tidak ditulis ke indeks kueri saat dibuat. Agar entity dapat diakses oleh kueri mendatang, Anda harus menulis ulang entity tersebut ke database Anda agar dapat dimasukkan dalam indeks yang sesuai. Artinya, Anda harus melakukan hal berikut untuk setiap entity yang sudah ada:

  1. Cari (dapatkan) entity.
  2. Tulis (memasukkan) entity kembali ke database Anda.

Demikian pula, mengubah properti dari diindeks menjadi dikecualikan hanya akan memengaruhi entity yang kemudian ditulis ke database Anda. Entri indeks untuk entitas yang sudah ada dengan properti tersebut akan terus ada sampai entitas diperbarui atau dihapus. Untuk menghindari hasil yang tidak diinginkan, Anda harus menghapus permanen kode dari semua kueri yang memfilter atau mengurutkan berdasarkan properti (yang kini dikecualikan).

Batas indeks

Firestore dalam mode Datastore menetapkan batas jumlah dan ukuran keseluruhan entri indeks yang dapat dikaitkan dengan satu entity. Batas ini cukup besar, dan sebagian besar aplikasi tidak terpengaruh. Namun, ada situasi saat Anda mungkin mencapai batas tersebut.

Seperti yang dijelaskan di atas, database mode Datastore membuat entri dalam indeks yang telah ditentukan untuk setiap properti setiap entity kecuali yang telah Anda deklarasikan secara eksplisit sebagai dikecualikan dari indeks Anda. Properti juga dapat disertakan dalam indeks kustom tambahan yang dideklarasikan pada file konfigurasi indeks Anda (index.yaml). Asalkan suatu entity tidak memiliki properti daftar, entity akan memiliki maksimal satu entri di setiap indeks kustom tersebut (untuk indeks non-ancestor) atau satu entri untuk setiap ancestor entity (untuk indeks ancestor). Masing-masing entri indeks ini harus diperbarui setiap kali nilai properti berubah.

Untuk properti yang memiliki satu nilai untuk setiap entity, setiap kemungkinan nilai hanya perlu disimpan sekali per entity dalam indeks standar properti. Meski begitu, entitas dengan properti bernilai tunggal dalam jumlah besar dapat melebihi entri indeks atau batas ukuran. Demikian pula, entity yang dapat memiliki beberapa nilai untuk properti yang sama memerlukan entri indeks terpisah untuk setiap nilai. Sekali lagi, jika jumlah kemungkinan nilai banyak, entity tersebut dapat melebihi batas entri.

Situasi menjadi lebih buruk jika ada beberapa properti yang memiliki beberapa properti, yang masing-masing dapat memiliki beberapa nilai. Untuk mengakomodasi entitas seperti itu, indeks harus menyertakan entri untuk setiap kemungkinan kombinasi nilai properti. Indeks kustom yang merujuk ke beberapa properti, masing-masing dengan beberapa nilai, dapat "meledak" secara kombinasi, sehingga memerlukan entri dalam jumlah besar untuk entity dengan hanya sejumlah kecil kemungkinan nilai properti. Indeks yang meledak tersebut dapat meningkatkan ukuran penyimpanan entity secara drastis, karena banyaknya entri indeks yang harus disimpan. Indeks yang meledak juga dapat menyebabkan entity melebihi jumlah entri indeks atau batas ukuran.

Pertimbangkan kode berikut:

C#

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C# Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Entity task = new Entity()
{
    Key = _db.CreateKeyFactory("Task").CreateKey("sampleTask"),
    ["tags"] = new ArrayValue() { Values = { "fun", "programming", "learn" } },
    ["collaborators"] = new ArrayValue() { Values = { "alice", "bob", "charlie" } },
    ["created"] = DateTime.UtcNow
};

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

task := &Task{
	Tags:          []string{"fun", "programming", "learn"},
	Collaborators: []string{"alice", "bob", "charlie"},
	Created:       time.Now(),
}

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Entity task =
    Entity.newBuilder(taskKey)
        .set("tags", "fun", "programming", "learn")
        .set("collaborators", "alice", "bob", "charlie")
        .set("created", Timestamp.now())
        .build();

Node.js

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

const task = {
  method: 'insert',
  key: datastore.key('Task'),
  data: {
    tags: ['fun', 'programming', 'learn'],
    collaborators: ['alice', 'bob', 'charlie'],
    created: new Date(),
  },
};

PHP

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API PHP Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

$task = $datastore->entity(
    $datastore->key('Task'),
    [
        'tags' => ['fun', 'programming', 'learn'],
        'collaborators' => ['alice', 'bob', 'charlie'],
        'created' => new DateTime(),
    ]
);

Python

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

from google.cloud import datastore

# For help authenticating your client, visit
# https://cloud.google.com/docs/authentication/getting-started
client = datastore.Client()

task = datastore.Entity(client.key("Task"))
task.update(
    {
        "tags": ["fun", "programming", "learn"],
        "collaborators": ["alice", "bob", "charlie"],
        "created": datetime.datetime.now(tz=datetime.timezone.utc),
    }
)

Ruby

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Cloud Datastore, lihat library klien Cloud Datastore. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Ruby Cloud Datastore.

Untuk melakukan autentikasi ke Cloud Datastore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

task = datastore.entity "Task" do |t|
  t["tags"] = ["fun", "programming", "learn"]
  t["collaborators"] = ["alice", "bob", "charlie"]
  t["created"] = Time.now
end

GQL

Tidak Berlaku

Metode ini membuat entity Task dengan tiga nilai untuk properti tags, tiga nilai untuk properti collaborators, dan created yang ditetapkan ke tanggal saat ini. Tindakan ini akan memerlukan 9 entri indeks, satu untuk setiap kemungkinan kombinasi nilai properti:

('fun', 'alice', NOW())
('fun', 'bob', NOW())
('fun', 'charlie', NOW())

('programming', 'alice', NOW())
('programming', 'bob', NOW())
('programming', 'charlie', NOW())

('learn', 'alice', NOW())
('learn', 'bob', NOW())
('learn', 'charlie', NOW())

Jika properti yang sama diulang beberapa kali, Firestore dalam mode Datastore dapat mendeteksi indeks yang meledak dan menyarankan indeks alternatif. Namun, dalam semua situasi lain (seperti kueri yang ditentukan dalam contoh ini), database mode Datastore akan menghasilkan indeks yang meledak. Dalam hal ini, Anda dapat mengakali indeks yang meledak dengan mengonfigurasi indeks secara manual dalam file konfigurasi indeks:

indexes:
- kind: Task
  properties:
  - name: tags
  - name: created
- kind: Task
  properties:
  - name: collaborators
  - name: created

Tindakan ini mengurangi jumlah entri yang diperlukan hanya menjadi (|tags| * |created| + |collaborators| * |created|), atau 6 entri, bukan 9:

('fun', NOW())
('programming', NOW())
('learn', NOW())

('alice', NOW())
('bob', NOW())
('charlie', NOW())

Semua operasi commit yang akan menyebabkan indeks melebihi entri indeks atau batas ukuran akan gagal. Teks error menjelaskan batas mana yang terlampaui ("Too many indexed properties" atau "Index entries too large") dan indeks kustom mana yang menjadi penyebabnya. Jika Anda membuat indeks baru yang akan melebihi batas entity apa pun saat di-build, kueri terhadap indeks akan gagal dan indeks akan muncul dalam status Error di konsol Google Cloud. Untuk menangani indeks Error tersebut,

  1. Hapus indeks dari file konfigurasi indeks Anda (index.yaml).
  2. Dengan Google Cloud CLI, hapus indeks dari database menggunakan perintah datastore indexes cleanup, seperti yang dijelaskan dalam Menghapus indeks yang tidak digunakan.
  3. Atau
    • merumuskan ulang definisi indeks dan kueri yang sesuai, atau
    • menghapus entitas yang menyebabkan indeks meledak.
  4. Tambahkan indeks kembali ke index.yaml.
  5. Dengan menggunakan Google Cloud CLI, tambahkan indeks ke database dengan menjalankan perintah datastore indexes create, seperti yang dijelaskan dalam Memperbarui Indeks.

Anda dapat menghindari ledakan indeks dengan menghindari kueri yang memerlukan indeks kustom menggunakan properti daftar. Seperti yang dijelaskan sebelumnya, kueri ini mencakup kueri dengan beberapa tata urutan atau kueri dengan campuran filter kesetaraan dan ketidaksetaraan.

Indeks untuk proyeksi

Kueri proyeksi mengharuskan semua properti yang ditentukan dalam proyeksi disertakan dalam indeks. Emulator Datastore secara otomatis menghasilkan indeks yang diperlukan untuk Anda dalam file konfigurasi indeks, index.yaml, yang diupload dengan aplikasi Anda.

Salah satu cara untuk meminimalkan jumlah indeks yang diperlukan adalah dengan memproyeksikan properti yang sama secara konsisten, meskipun tidak semuanya selalu diperlukan. Misalnya, kueri ini memerlukan dua indeks terpisah:

SELECT priority, percent_complete FROM Task

SELECT priority, percent_complete, created FROM Task

Namun, jika Anda selalu memproyeksikan properti priority, percent_complete, created, meskipun created tidak diperlukan, hanya satu indeks yang akan diperlukan.

Mengonversi kueri yang ada menjadi kueri proyeksi mungkin memerlukan pembuatan indeks baru jika properti dalam proyeksi belum disertakan pada bagian kueri yang lain. Sebagai contoh, misalnya Anda memiliki kueri yang ada seperti

SELECT * FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

yang membutuhkan indeks:

indexes:
- kind: Task
  properties:
  - name: priority
  - name: percent_complete

Mengonversi ini ke salah satu kueri proyeksi

SELECT created FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

SELECT priority, percent_complete, created FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

memperkenalkan properti baru (created) sehingga memerlukan pembuatan indeks baru:

indexes:
- kind: Task
  properties:
  - name: priority
  - name: percent_complete
  - name: created

Namun,

SELECT priority, percent_complete FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

tidak akan mengubah indeks yang diperlukan, karena properti yang diproyeksikan, yaitu priority dan percent_complete, sudah disertakan dalam kueri yang ada.

Beberapa database

Anda dapat menggunakan gcloud firestore untuk mengelola satu indeks untuk mode Datastore atau menggunakan gcloud datastore dengan file index.yaml untuk mengelola semua indeks pada database.

gcloud firestore
gcloud firestore indexes composite create --api-scope=datastore-mode-api  --query-scope=QUERY_SCOPE --database=DATABASE_ID
gcloud datastore
gcloud alpha datastore indexes create index.yaml --database=DATABASE_ID

Ganti kode berikut:

  • DATABASE_ID: ID database.
  • QUERY_SCOPE: collection-recursive untuk indeks ancestor atau collection-group untuk indeks non-ancestor.