Na tej stronie dowiesz się, jak zarządzać indeksami. Więcej informacji o indeksach znajdziesz w omówieniu indeksów.
Zanim zaczniesz
Zanim utworzysz indeks w Cloud Firestore, upewnij się, że masz przypisaną jedną z tych ról:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Informacje o przyznawaniu ról znajdziesz w artykule Przyznawanie pojedynczej roli. Więcej informacji o rolach Cloud Firestore i powiązanych z nimi uprawnieniach znajdziesz w artykule Wstępnie zdefiniowane role.
Jeśli masz zdefiniowane role niestandardowe, przypisz wszystkie te uprawnienia, aby utworzyć indeksy:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Utwórz indeks
Aby utworzyć indeks, wykonaj te czynności:
MongoDB API
Aby utworzyć indeks, użyj metody createIndex(). Przykład:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
Tworzenie indeksu za pomocą
db.runCommand()jest też obsługiwane w przypadku maksymalnie 1 indeksu.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
Pamiętaj o tych ograniczeniach:
- Każda prośba może dotyczyć utworzenia tylko jednego indeksu.
db.collection.createIndexes()nie jest obsługiwany. - Dzienniki kontroli tworzenia indeksu za pomocą interfejsu MongoDB API używają nazwy metody
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Listę obsługiwanych opcji indeksu znajdziesz w sekcji Indeksy i właściwości indeksu.
Firebase konsola
-
W konsoli Firebase otwórz stronę Baza danych Firestore.
- Wybierz bazę danych z listy baz danych.
- Na karcie Indeksy kliknij Utwórz indeks.
- Wpisz identyfikator kolekcji.
- Dodaj co najmniej jedną ścieżkę pola i wybierz dla każdej z nich opcję indeksu.
- Wybierz opcję obecności pola: nie rzadkie lub rzadkie.
- Opcjonalnie możesz ustawić opcję indeksu wielokluczowego.
- Kliknij Utwórz.
- Nowy indeks pojawi się na liście indeksów i Cloud Firestore rozpocznie się jego tworzenie. Gdy indeks zostanie utworzony, obok niego pojawi się zielona ikona potwierdzenia. Jeśli indeks nie zostanie utworzony, zapoznaj się z sekcją Błędy tworzenia indeksu, aby poznać możliwe przyczyny.
gcloud CLI
Aby utworzyć indeks, użyj polecenia
gcloud firestore indexes composite create. Ustaw wartość api-scope na mongodb-compatible-api.
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
Zastąp następujące elementy:
- DATABASE_ID: identyfikator bazy danych.
- COLLECTION: nazwa kolekcji.
- FIELD_CONFIGURATION: konfiguracja pola. W przypadku każdego pola dodaj
--field-config=field-path=. Przykład:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descendingWięcej informacji o konfigurowaniu tych pól znajdziesz w artykule
--field-config.
Aby utworzyć indeks rzadki, ustaw wartość --density=sparse-any.
Aby utworzyć indeks wielokluczowy, dodaj flagę --multikey.
Aby utworzyć unikalny indeks, dodaj flagę --unique.
Terraform
Użyj zasobu google_firestore_index i ustaw api_scope na MONGODB_COMPATIBLE_API oraz query_scope na COLLECTION_GROUP.
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" }
Zastąp następujące elementy:
- DATABASE_ID: identyfikator bazy danych wybranej przez Ciebie bazy danych.
- COLLECTION: nazwa kolekcji do indeksowania.
- FIELD_PATH: nazwa pola do indeksowania.
- ORDER: jedna z wartości
ASCENDINGlubDESCENDING - DENSITY: jedna z wartości
SPARSE_ANYlubDENSE
Tworzenie indeksu tekstowego
Utwórz indeks tekstowy, jeśli chcesz wyszukiwać w kolekcji konkretne ciągi znaków.
Aby utworzyć indeks tekstowy dla kolekcji, wykonaj te czynności:
MongoDB API
Aby utworzyć indeks tekstowy, użyj metody
createIndex().
W poniższym przykładzie, gdy dokument jest zapisywany w kolekcji cities z wypełnionymi polami country lub food, te pola są indeksowane na potrzeby wyszukiwania.
db.cities.createIndex({"country": "text", "food": "text"})
Aby pole mogło zostać zindeksowane, musi być ciągiem znaków lub tablicą ciągów znaków.
Indeksy tablic nie są indeksowane na potrzeby wyszukiwania. W rezultacie indeksowanie a.1.b spowoduje zindeksowanie something w {a: {1: {b: something}}}, ale nie w {a: [one, {b: something}]}.
Indeksy możesz też tworzyć za pomocą db.runCommand(). W każdej kolekcji możesz mieć tylko 1 indeks tekstowy, ale w jednym db.runCommand() możesz utworzyć wiele indeksów różnych typów. W tym przykładzie do utworzenia indeksu tekstowego użyto znaku db.runCommand():
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Określanie języka domyślnego
Opcjonalnie możesz też określić domyślny język lub ścieżkę do pola w dokumencie, które będzie zawierać domyślny język.
W tym przykładzie myLanguageField jest określony jako language_override. Gdy dokument w kolekcji cities zawiera pole o nazwie myLanguageField, wartość tego pola jest używana do określania języka indeksowania pola country w tym konkretnym dokumencie. Ta wartość zastępuje domyślny język french.
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- Język możesz wpisać w postaci pełnej nazwy (
english) lub dwuliterowego kodu języka ISO (en). - Jeśli język domyślny nie zostanie ustawiony, domyślnie będzie to Cloud Firestore angielski.
- Pole zastąpienia języka musi być polem najwyższego poziomu. Jeśli nie ustawisz tego pola, domyślna wartość pola zastąpienia języka to
language. - Jeśli ustawisz domyślny język na znak
null, Cloud Firestore nie będzie używać żadnego pola jako zastąpienia języka.
Rozwiń, aby wyświetlić listę obsługiwanych języków
| Kod języka | Nazwa języka |
|---|---|
| „und” | Wykryj automatycznie |
| „af” | afrikaans |
| „ak” | akan |
| „sq” | albański |
| „am” | amharski |
| „ar” | arabski |
| „hy” | ormiański |
| „az” | azerski |
| „eu” | baskijski |
| „be” | białoruski |
| „bn” | bengalski |
| „bs” | bośniacki |
| „bg” | bułgarski |
| „my” | birmański |
| „ca” | kataloński |
| „ceb” | cebuański |
| „chr” | Czirokeski |
| „zh” | chiński |
| "zh-Hant" | chiński_tradycyjny |
| „hr” | chorwacki |
| „cs” | czeski |
| „da” | duński |
| „nl” | niderlandzki |
| „en” | angielski |
| „eo” | esperanto |
| „et” | estoński |
| „fil” | filipiński |
| „fi” | fiński |
| "fr" | francuski |
| „gl” | galicyjski |
| „ka” | gruziński |
| „de” | niemiecki |
| „el” | grecki |
| "gu" | gudżarati |
| „ht” | kreolski_haitański |
| „ha” | hausa |
| „haw” | hawajski |
| „iw” | hebrajski |
| „Cześć” | hindi |
| „hmn” | hmong |
| „hu” | węgierski |
| „is” | islandzki |
| „ig” | igbo |
| „id” | indonezyjski |
| „ga” | irlandzki |
| „it” | włoski |
| „ja” | japoński |
| „jv” | jawajski |
| „kn” | kannada |
| „kk” | kazachski |
| „km” | khmerski |
| „ko” | koreański |
| „lo” | laotański |
| „la” | łaciński |
| „lv” | łotewski |
| "lt" | litewski |
| „lb” | luksemburski |
| „mk” | macedoński |
| „mg” | malgaski |
| „ms” | malajski |
| „ml” | malajalam |
| „mt” | maltański |
| „mi” | maoryski |
| "mr" | marathi |
| „mfe” | kreolski Mauritiusa |
| „mn” | mongolski |
| „sr-ME” | Serbian_Montenegro |
| „ne” | nepalski |
| „nie” | norweski |
| „ny” | njandża |
| „lub” | orija |
| „fa” | perski |
| „pl” | polski |
| „pt-BR” | portugalski_brazylijski |
| „pt-PT” | portugalski_Portugalia |
| „pa” | pendżabski |
| „ro” | rumuński |
| "ru" | rosyjski |
| „gd” | gaelicki szkocki |
| "sr" | serbski |
| „st” | sotho południowy |
| „si” | syngaleski |
| „sk” | słowacki |
| „sl” | słoweński |
| „so” | somalijski |
| „es” | hiszpański |
| „su” | sundajski |
| "sw" | suahili |
| „sv” | szwedzki |
| „tg” | tadżycki |
| „ta” | tamilski |
| „te” | telugu |
| „th” | tajski |
| „tr” | turecki |
| „uk” | ukraiński |
| „ur” | urdu |
| „uz” | uzbecki |
| „vi” | wietnamski |
| „cy” | walijski |
| „yi” | jidysz |
| „yo” | joruba |
| „zu” | zulu |
Dzielenie indeksu tekstowego na partycje
Możesz też podzielić indeks na partycje za pomocą pola, aby filtrować zapytania według określonej wartości pola. Ta konfiguracja umożliwia uruchamianie wydajniejszych zapytań, jeśli zawsze potrzebujesz określonego pola filtrowanego w indeksie, w którym wysyłasz zapytanie.
Aby utworzyć indeks z partycją, skonfiguruj pole firestoreOptions w ten sposób:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Gdzie:
PARTITIONED_FIELDto nazwa pola używanego do partycjonowania. Ta wartość musi być ciągiem znaków i odnosić się do pola najwyższego poziomu. Gdy uruchamiasz zapytanie do indeksu podzielonego na partycje, możesz filtrować wyniki na podstawie wartości tego pola. Możesz na przykład podzielić indeks za pomocą znakucity. Jeśli w indeksie tekstowym zdefiniowano polecity, użytkownicy mogą wysyłać zapytania dotyczące konkretnego miasta.Partycja musi być tylko jednym polem. Jeśli podzielisz indeks na partycje, możesz uruchamiać tylko zapytania, w których określono pole partycjonowania.
Ograniczenia
- Każda prośba może dotyczyć utworzenia tylko jednego indeksu.
- Logi kontrolne tworzenia indeksu za pomocą interfejsu MongoDB API używają nazwy metody
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Listę obsługiwanych opcji indeksu znajdziesz w sekcji Indeksy i właściwości indeksu.
Firebase konsola
W Firebasekonsoli otwórz stronę Baza danych Firestore.
Wybierz bazę danych z listy baz danych.
Na karcie Indeksy kliknij Utwórz indeks.
Wpisz identyfikator kolekcji.
Dodaj co najmniej jedną ścieżkę pola i wybierz dla każdej z nich opcję indeksu.
Kliknij Utwórz.
Nowy indeks pojawi się na liście indeksów, a operacje zgodne z MongoDB rozpoczną tworzenie indeksu. Gdy indeks zostanie utworzony, obok niego pojawi się zielony znacznik wyboru. Jeśli indeks nie zostanie utworzony, zapoznaj się z sekcją Błędy podczas tworzenia indeksu, aby poznać możliwe przyczyny.
Tworzenie indeksu 2dsphere
Utwórz indeks 2dsphere, aby wykonywać zapytania geoprzestrzenne i wyszukiwać dokumenty znajdujące się w określonym zakresie od konkretnej długości i szerokości geograficznej.
Aby utworzyć indeks 2dsphere dla kolekcji, wykonaj te czynności:
MongoDB API
Aby utworzyć indeks, użyj metody createIndex(). Przykład:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
Tworzenie indeksu za pomocą db.runCommand() jest też obsługiwane w przypadku co najwyżej jednego indeksu:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
Partycjonowanie indeksu 2dsphere
Możesz też podzielić indeks na partycje za pomocą pola, aby filtrować zapytania według określonej wartości pola. Ta konfiguracja umożliwia uruchamianie wydajniejszych zapytań, jeśli zawsze potrzebujesz określonego pola filtrowanego w indeksie, w którym wysyłasz zapytanie.
Aby utworzyć indeks z partycją, skonfiguruj pole firestoreOptions w ten sposób:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Gdzie:
PARTITIONED_FIELDto nazwa pola używanego do partycjonowania. Gdy uruchamiasz zapytanie do indeksu podzielonego na partycje, możesz filtrować wyniki na podstawie wartości tego pola. Jeśli na przykład indeks zawiera poleregionz lokalizacjami regionalnymi, możesz podzielić indeks za pomocą polaregion, aby użytkownicy mogli wyszukiwać restauracje w swoim regionie.Jeśli podzielisz indeks na partycje, możesz uruchamiać tylko zapytania, w których określono pole podziału na partycje.
Ograniczenia
- Każda prośba może dotyczyć utworzenia tylko jednego indeksu.
- Logi kontrolne tworzenia indeksu za pomocą interfejsu MongoDB API używają nazwy metody
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Listę obsługiwanych opcji indeksu znajdziesz w sekcji Indeksy i właściwości indeksu.
Firebase konsola
W Firebasekonsoli otwórz stronę Baza danych Firestore.
Wybierz bazę danych z listy baz danych.
Na karcie Indeksy kliknij Utwórz indeks.
Wpisz identyfikator kolekcji.
Dodaj co najmniej jedną ścieżkę pola i wybierz dla każdej z nich opcję indeksu.
Kliknij Utwórz.
Nowy indeks pojawi się na liście indeksów, a operacje zgodne z MongoDB rozpoczną tworzenie indeksu. Gdy indeks zostanie utworzony, obok niego pojawi się zielony znacznik wyboru. Jeśli indeks nie zostanie utworzony, zapoznaj się z sekcją Błędy podczas tworzenia indeksu, aby poznać możliwe przyczyny.
Usuwanie indeksu
Aby usunąć indeks, wykonaj te czynności:
MongoDB API
Aby usunąć indeks, użyj metody dropIndex(). Przykład:
Usuwanie indeksu za pomocą nazwy indeksu
db.restaurants.dropIndex("cuisine_index")
Usuwanie indeksu za pomocą definicji indeksu
db.restaurants.dropIndex({"cuisine" : 1})
Firebase konsola
-
W konsoli Firebase otwórz stronę Baza danych Firestore.
- Wybierz bazę danych z listy baz danych.
- Kliknij kartę Indeksy.
- Na liście indeksów kliknij Usuń na przycisku Więcej obok indeksu, który chcesz usunąć.
- Kliknij Usuń indeks.
gcloud CLI
Aby znaleźć nazwę indeksu, użyj polecenia
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Zastąp DATABASE_ID identyfikatorem bazy danych.
-
Aby usunąć indeks, użyj polecenia
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Zastąp następujące elementy:
- INDEX_NAME: nazwa indeksu
- DATABASE_ID: identyfikator bazy danych
Czas kompilacji indeksu
Aby utworzyć indeks, musisz go najpierw utworzyć, a potem Cloud Firestore wypełnić wpisami indeksu na podstawie istniejących danych. Czas potrzebny na utworzenie indeksu zależy od tych czynników:
Minimalny czas kompilacji indeksu wynosi kilka minut, nawet w przypadku pustej bazy danych.
Czas potrzebny na uzupełnienie wpisów indeksu zależy od ilości istniejących danych, które mają się znaleźć w nowym indeksie. Im więcej wartości pól pasuje do definicji indeksu, tym dłużej trwa uzupełnianie wpisów indeksu.
Zarządzanie długo trwającymi operacjami
Tworzenie indeksu to długo trwająca operacja. W sekcjach poniżej znajdziesz informacje o tym, jak korzystać z długotrwałych operacji dotyczących indeksów.
Po rozpoczęciu tworzenia indeksu usługa Cloud Firestore przypisuje operacji unikalną nazwę. Nazwy operacji mają prefiks projects/PROJECT_ID/databases/DATABASE_ID/operations/, np.:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Podczas określania nazwy operacji dla polecenia describe możesz pominąć prefiks.
Wyświetlanie listy wszystkich długo trwających operacji
Aby wyświetlić listę długotrwałych operacji, użyj polecenia
gcloud firestore operations list. To polecenie wyświetla listę trwających i niedawno zakończonych operacji.
Operacje są wyświetlane przez kilka dni po ich zakończeniu:
gcloud firestore operations list
Sprawdzanie stanu operacji
Zamiast wyświetlać listę wszystkich długo trwających operacji, możesz wyświetlić szczegóły jednej operacji:
gcloud firestore operations describe operation-name
Szacowanie czasu ukończenia
Podczas działania operacji sprawdzaj wartość pola state, aby poznać ogólny stan operacji.
Żądanie stanu długo trwającej operacji zwraca też dane workEstimated i workCompleted. workEstimated – szacowana łączna liczba dokumentów, które zostaną przetworzone w ramach operacji. workCompleted
pokazuje liczbę przetworzonych do tej pory dokumentów. Po zakończeniu operacji wartość w polu
workCompleted odzwierciedla łączną liczbę faktycznie przetworzonych dokumentów, która może się różnić od wartości w polu workEstimated.
Aby oszacować postęp operacji, podziel workCompleted przez workEstimated.
Oto przykład postępu tworzenia indeksu:
{
"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"
}
},
},
...
Po zakończeniu operacji jej opis będzie zawierać "done": true. Sprawdź wartość pola state, aby poznać wynik operacji. Jeśli w odpowiedzi nie ma pola done, oznacza to, że operacja nie została ukończona.