רלוונטי רק למהדורת Cloud Firestore Enterprise. |
בדף הזה מוסבר איך לנהל את האינדקסים. לסקירה כללית על האינדקסים
לפני שמתחילים
כדי ליצור אינדקס ב-Cloud Firestore עם תאימות ל-MongoDB, צריך לוודא שהוקצה לכם אחד מהתפקידים הבאים:
roles/datastore.owner
roles/datastore.indexAdmin
roles/editor
roles/owner
כדי להקצות תפקיד, ראו הקצאת תפקיד יחיד. מידע נוסף על תפקידי Cloud Firestore וההרשאות שמשויכות אליהם זמין במאמר תפקידים מוגדרים מראש.
אם הגדרתם תפקידים בהתאמה אישית, צריך להקצות את כל ההרשאות הבאות כדי ליצור אינדקסים:
datastore.indexes.create
datastore.indexes.delete
datastore.indexes.get
datastore.indexes.list
datastore.indexes.update
יצירת אינדקס
כדי ליצור אינדקס, מבצעים את השלבים הבאים:
MongoDB API
משתמשים ב-method createIndex()
כדי ליצור אינדקס. לדוגמה:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
אפשר ליצור אינדקסים באמצעות
db.runCommand()
, אבל אפשר ליצור רק אינדקס אחד.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
חשוב לשים לב למגבלות הבאות:
- אפשר ליצור רק אינדקס אחד לכל בקשה. אין תמיכה ב-
db.collection.createIndexes()
. - יומני הביקורת ליצירת אינדקס באמצעות MongoDB API משתמשים בשם השיטה
google.firestore.admin.v1.FirestoreAdmin.CreateIndex
. - אפשרויות האינדקס הנתמכות מפורטות במאמר אינדקסים ומאפייני אינדקס.
מסוף Firebase
-
במסוף Firebase, עוברים לדף Firestore Database.
- בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
- בכרטיסייה Indexes, לוחצים על Create Index.
- מזינים מזהה אוסף.
- מוסיפים נתיב שדה אחד או יותר ובוחרים אפשרות אינדקס לכל אחד מהם.
- בוחרים באפשרות נוכחות של שדה, לא דלילה או דלילה.
- אפשר גם להגדיר את האפשרות multikey index.
- לוחצים על יצירה.
- האינדקס החדש מוצג ברשימת האינדקסים, ו-Cloud Firestore עם תאימות ל-MongoDB מתחיל ליצור את האינדקס. אחרי שהאינדקס נוצר, מופיע לצידו סימן וי ירוק. אם האינדקס לא נוצר, כדאי לעיין בשגיאות בבניית אינדקס כדי לראות מהן הסיבות האפשריות.
gcloud CLI
כדי ליצור אינדקס, משתמשים בפקודה gcloud firestore indexes composite create
. מגדירים את api-scope
לערך 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
מחליפים את מה שכתוב בשדות הבאים:
- DATABASE_ID: מזהה מסד נתונים.
- COLLECTION: שם האוסף.
- FIELD_CONFIGURATION: הגדרת שדה. לכל שדה,
מוסיפים
--field-config=field-path=
. לדוגמה:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descending
מידע נוסף על הגדרת השדות האלה זמין במאמר
--field-config
.
כדי ליצור אינדקס דליל, מגדירים את --density=sparse-any
.
כדי ליצור אינדקס עם כמה מפתחות, מוסיפים את הדגל --multikey
.
כדי ליצור אינדקס ייחודי, מוסיפים את הדגל --unique
.
Terraform
משתמשים במשאב google_firestore_index
ומגדירים את api_scope
ל-MONGODB_COMPATIBLE_API
ואת query_scope
ל-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" }
מחליפים את מה שכתוב בשדות הבאים:
- DATABASE_ID: מזהה מסד הנתונים של מסד הנתונים שבחרתם
- COLLECTION: שם האוסף לאינדקס
- FIELD_PATH: שם השדה ליצירת אינדקס
- ORDER: אחד מהמאפיינים
ASCENDING
אוDESCENDING
- DENSITY: אחד מהמאפיינים
SPARSE_ANY
אוDENSE
מחיקת אינדקס
כדי למחוק אינדקס, פועלים לפי השלבים הבאים:
MongoDB API
כדי למחוק אינדקס, משתמשים ב-method dropIndex()
. לדוגמה:
מחיקת אינדקס באמצעות שם האינדקס
db.restaurants.dropIndex("cuisine_index")
מחיקת אינדקס באמצעות הגדרת אינדקס
db.restaurants.dropIndex({"cuisine" : 1})
מסוף Firebase
-
במסוף Firebase, עוברים לדף Firestore Database.
- בוחרים מסד נתונים מתוך רשימת מסדי הנתונים.
- לוחצים על הכרטיסייה Indexes (אינדקסים).
- ברשימת האינדקסים, לוחצים על Delete (מחיקה) בלחצן More (אפשרויות נוספות) לצד האינדקס שרוצים למחוק.
- לוחצים על מחיקת האינדקס.
gcloud CLI
כדי למצוא את שם האינדקס, משתמשים בפקודה
gcloud firestore indexes composite list
.gcloud firestore indexes composite list \ --database='DATABASE_ID'
מחליפים את DATABASE_ID במזהה מסד הנתונים.
-
כדי למחוק את האינדקס, משתמשים בפקודה
gcloud firestore indexes composite delete
.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
מחליפים את מה שכתוב בשדות הבאים:
- INDEX_NAME: השם של אינדקס
- DATABASE_ID: מזהה מסד נתונים
זמן בניית האינדקס
כדי ליצור אינדקס, Cloud Firestore עם תאימות ל-MongoDB צריך ליצור את האינדקס ואז למלא מחדש את רשומות האינדקס עם נתונים קיימים. הזמן שנדרש ליצירת אינדקס נקבע לפי הגורמים הבאים:
זמן הבנייה המינימלי של אינדקס הוא כמה דקות, גם אם מדובר במסד נתונים ריק.
הזמן שנדרש למילוי חוסרים של רשומות באינדקס תלוי בכמות הנתונים הקיימים שצריכים להיכלל באינדקס החדש. ככל שיש יותר ערכי שדות שתואמים להגדרת האינדקס, כך יידרש יותר זמן למילוי חוזר של רשומות האינדקס.
ניהול פעולות ממושכות
בניית אינדקסים היא פעולה ממושכת. בקטעים הבאים מוסבר איך לעבוד עם פעולות ארוכות טווח של אינדקסים.
אחרי שמתחילים ליצור אינדקס, Cloud Firestore עם תאימות ל-MongoDB מקצה לפעולה שם ייחודי. שמות הפעולות מתחילים בקידומת projects/PROJECT_ID/databases/DATABASE_ID/operations/
, לדוגמה:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
אפשר להשמיט את הקידומת כשמציינים שם פעולה עבור הפקודה describe
.
הצגת רשימה של כל הפעולות הממושכות
כדי לראות רשימה של פעולות ממושכות, משתמשים בפקודה gcloud firestore operations list
. הפקודה הזו מציגה רשימה של פעולות שמתבצעות כרגע ופעולות שהושלמו לאחרונה.
הפעולות מופיעות למשך כמה ימים אחרי שהן מסתיימות:
gcloud firestore operations list
בדיקת סטטוס הפעולה
במקום להציג רשימה של כל הפעולות ארוכות הטווח, אפשר להציג את הפרטים של פעולה אחת:
gcloud firestore operations describe operation-name
חישוב משך הזמן המשוער לסיום
במהלך הפעולה, אפשר לראות את הערך של השדה state
כדי לדעת מה הסטטוס הכולל של הפעולה.
בקשה לסטטוס של פעולה ממושכת מחזירה גם את המדדים workEstimated
ו-workCompleted
. workEstimated
מציג את המספר הכולל המשוער של המסמכים שהפעולה תעבד. workCompleted
מציג את מספר המסמכים שעברו עיבוד עד עכשיו. אחרי שהפעולה מסתיימת, workCompleted
משקף את המספר הכולל של המסמכים שעברו עיבוד בפועל, שיכול להיות שונה מהערך של workEstimated
.
כדי להעריך את התקדמות הפעולה, מחלקים את workCompleted
ב-workEstimated
.
הדוגמה הבאה ממחישה את התהליך של יצירת אינדקס:
{ "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" } }, }, ...
כשפעולה מסתיימת, תיאור הפעולה יכלול את הערך "done": true
. התוצאה של הפעולה מופיעה בערך של השדה state
. אם השדה done
לא מוגדר בתגובה, הפעולה לא הושלמה.