Na tej stronie dowiesz się, jak zarządzać indeksami. Więcej informacji o indeksach znajdziesz w artykule Omówienie 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
Aby dowiedzieć się, jak przyznać rolę, przeczytaj artykuł o przyznawaniu pojedynczej roli. Więcej informacji o rolach Cloud Firestore i powiązanych z nimi uprawnieniach znajdziesz w artykule o rolach zdefiniowanych.
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", "indexes": [{"key": {"cuisine":1}, "name": "cuisine_index"}]})
Pamiętaj o tych ograniczeniach:
- W ramach jednego żądania możesz utworzyć tylko jeden indeks.
db.collection.createIndexes()nie jest obsługiwany. - Logi kontrolne dotyczące tworzenia indeksu za pomocą interfejsu MongoDB API używają nazwy metody
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Obsługiwane opcje indeksów znajdziesz w sekcji Indeksy i ich właściwości.
Konsola Firebase
-
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 1 ścieżkę pola i wybierz opcję indeksu dla każdej z nich.
- Wybierz opcję obecności pola: nierozproszone lub rozproszone.
- Opcjonalnie możesz ustawić opcję indeksu wielokluczowego.
- Kliknij Utwórz.
- Nowy indeks pojawi się na liście indeksów, a Cloud Firestore rozpocznie jego tworzenie. Gdy indeks zostanie utworzony, pojawi się obok niego zielony znacznik wyboru. Jeśli indeks nie zostanie utworzony, zapoznaj się z artykułem Błędy podczas tworzenia indeksu, aby poznać możliwe przyczyny.
gcloud CLI
Aby utworzyć indeks, użyj polecenia gcloud firestore indexes composite create. Ustaw 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 każdym polu 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 rozproszony, ustaw --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 wybranej bazy danych.
- COLLECTION: nazwa kolekcji do zindeksowania.
- FIELD_PATH: nazwa pola do zindeksowania.
- ORDER:
ASCENDINGlubDESCENDING - DENSITY:
SPARSE_ANYlubDENSE
Tworzenie indeksu tekstowego
Jeśli chcesz wyszukiwać konkretne ciągi znaków w kolekcji, utwórz indeks tekstowy.
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"})
Pole musi być ciągiem znaków lub tablicą ciągów znaków, aby można było je zindeksować.
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 jeden indeks tekstowy, ale w jednej bazie danych db.runCommand() możesz utworzyć wiele indeksów różnych typów. W tym przykładzie użyto db.runCommand() do utworzenia indeksu tekstowego:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Określanie języka domyślnego
Możesz też opcjonalnie określić domyślny język lub ścieżkę pola w dokumencie, która 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ślenia 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"})
- Możesz wpisać język w pełnej formie (
english) lub jako dwuliterowy kod ISO (en). - Jeśli nie ustawisz języka domyślnego, Cloud Firestore domyślnie będzie używać języka angielskiego.
- Pole zastąpienia języka musi być polem najwyższego poziomu. Jeśli nie ustawisz tego pola, domyślna wartość 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 |
| "pl" | angielski |
| "eo" | esperanto |
| "et" | estoński |
| "fil" | filipiński |
| "fi" | fiński |
| "pl" | 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 |
| „no” | norweski |
| "ny" | njandża |
| "or" | orija |
| "fa" | perski |
| "pl" | polski |
| "pt-BR" | portugalski_brazylijski |
| "pt-PT" | portugalski_portugalski |
| "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 |
Partycjonowanie indeksu tekstowego
Możesz też podzielić indeks na partycje za pomocą pola, aby filtrować zapytania według określonej wartości pola. Ta konfiguracja pozwala na uruchamianie bardziej wydajnych zapytań, jeśli zawsze potrzebujesz określonego pola filtrowanego w indeksie, do którego 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 na potrzeby partycji. Ta wartość musi być ciągiem znaków i musi odnosić się do pola najwyższego poziomu. Gdy uruchamiasz zapytanie względem indeksu partycjonowanego, możesz filtrować wyniki na podstawie wartości tego pola. Możesz na przykład podzielić indeks na partycje za pomocącity. Jeśli w indeksie tekstowym zdefiniowane jest 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 partycjonowane.
Ograniczenia
- W ramach jednego żądania możesz utworzyć tylko jeden indeks.
- Logi kontrolne tworzenia indeksu za pomocą interfejsu MongoDB API używają nazwy metody
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Informacje o obsługiwanych opcjach indeksów znajdziesz w artykule o indeksach i ich właściwościach.
Konsola Firebase
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 1 ścieżkę pola i wybierz opcję indeksu dla każdej z nich.
Kliknij Utwórz.
Nowy indeks pojawi się na liście indeksów, a operacje zgodne z MongoDB zaczną go tworzyć. Gdy indeks zostanie utworzony, pojawi się obok niego zielona ikona potwierdzenia. Jeśli indeks nie został utworzony, zapoznaj się z artykułem Błędy podczas tworzenia indeksu, aby poznać możliwe przyczyny.
gcloud CLI
Aby utworzyć indeks tekstowy, użyj polecenia gcloud firestore indexes composite create. Ustaw --api-scope na mongodb-compatible-api.
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
Zastąp następujące elementy:
- DATABASE_ID: identyfikator bazy danych.
- COLLECTION_GROUP: identyfikator kolekcji do zindeksowania.
- FIELD_NAME: nazwa pola do zindeksowania.
Flaga --async powoduje, że operacja tworzenia indeksu jest wykonywana w tle.
Tworzenie indeksu 2dsphere
Utwórz indeks 2dsphere, aby wykonywać zapytania geoprzestrzenne i wyszukiwać dokumenty, które znajdują się w określonym zakresie od określonej 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 maksymalnie 1 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 pozwala na uruchamianie bardziej wydajnych zapytań, jeśli zawsze potrzebujesz określonego pola filtrowanego w indeksie, do którego 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. Podczas wykonywania zapytania na indeksie podzielonym 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 na partycje za pomocąregion, 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 partycjonowane.
Ograniczenia
- W ramach jednego żądania możesz utworzyć tylko jeden indeks.
- Logi kontrolne tworzenia indeksu za pomocą interfejsu MongoDB API używają nazwy metody
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Informacje o obsługiwanych opcjach indeksów znajdziesz w artykule o indeksach i ich właściwościach.
Konsola Firebase
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 1 ścieżkę pola i wybierz opcję indeksu dla każdej z nich.
Kliknij Utwórz.
Nowy indeks pojawi się na liście indeksów, a operacje zgodne z MongoDB zaczną go tworzyć. Gdy indeks zostanie utworzony, pojawi się obok niego zielona ikona potwierdzenia. Jeśli indeks nie został utworzony, zapoznaj się z artykułem Błędy podczas tworzenia indeksu, aby poznać możliwe przyczyny.
gcloud CLI
Aby utworzyć indeks 2dsphere, użyj polecenia gcloud firestore indexes composite create. Ustaw --api-scope na mongodb-compatible-api.
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 \
--asyncZastąp następujące elementy:
- DATABASE_ID: identyfikator bazy danych.
- COLLECTION_GROUP: identyfikator kolekcji do zindeksowania.
- FIELD_NAME: nazwa pola do zindeksowania.
Flaga --async powoduje, że operacja tworzenia indeksu jest wykonywana w tle.
Usuwanie indeksu
Aby usunąć indeks, wykonaj te czynności:
MongoDB API
Aby usunąć indeks, użyj metody dropIndex(). Przykład:
Usuwanie indeksu przy użyciu jego nazwy
db.restaurants.dropIndex("cuisine_index")
Usuwanie indeksu za pomocą definicji indeksu
db.restaurants.dropIndex({"cuisine" : 1})
Konsola Firebase
-
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 przycisk Więcej i wybierz Usuń 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 tworzenia indeksu
Aby utworzyć indeks, Cloud Firestore musi utworzyć indeks, a następnie wypełnić wpisy indeksu istniejącymi danymi. Czas potrzebny na utworzenie indeksu zależy od tych czynników:
Minimalny czas tworzenia 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 należą do nowego indeksu. 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 indeksów to długo trwająca operacja. W poniższych sekcjach opisujemy, jak pracować z długo trwającymi operacjami na indeksach.
Gdy zaczniesz tworzyć indeks, Cloud Firestore przypisze operacji unikalną nazwę. Nazwy operacji są poprzedzone prefiksem projects/PROJECT_ID/databases/DATABASE_ID/operations/, na przykład:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Możesz pominąć prefiks, gdy podajesz nazwę operacji w poleceniu describe.
Wyświetlanie listy wszystkich długo trwających operacji
Aby wyświetlić listę długo trwających operacji, użyj polecenia gcloud firestore operations list. To polecenie wyświetla listę trwających i ostatnio 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 pojedynczej operacji:
gcloud firestore operations describe operation-name
Szacowanie czasu ukończenia
Podczas wykonywania operacji możesz sprawdzić wartość pola state, aby poznać ogólny stan operacji.
Żądanie stanu długo trwającej operacji zwraca też dane workEstimated i workCompleted. workEstimated pokazuje szacowaną łączną liczbę dokumentów, które zostaną przetworzone w ramach operacji. workCompleted pokazuje liczbę dokumentów przetworzonych do tej pory. Po zakończeniu operacji workCompleted odzwierciedla łączną liczbę dokumentów, które zostały faktycznie przetworzone. Może ona być inna niż wartość 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. Wynik operacji znajdziesz w polu state. Jeśli w odpowiedzi nie ma pola done, operacja nie została zakończona.