จัดการดัชนี

หน้านี้จะอธิบายวิธีจัดการดัชนี ดูข้อมูลเพิ่มเติม เกี่ยวกับดัชนีได้ที่ ภาพรวมของดัชนี

ก่อนเริ่มต้น

ก่อนที่จะสร้างดัชนีใน Cloud Firestore ได้ โปรดตรวจสอบว่าคุณได้รับมอบหมายบทบาทใดบทบาทหนึ่งต่อไปนี้

  • 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

ใช้เมธอด createIndex() เพื่อสร้างดัชนี เช่น

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • ระบบยังรองรับการสร้างดัชนีด้วย db.runCommand() โดยสร้างดัชนีได้สูงสุด 1 รายการ

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

โปรดทราบข้อจำกัดต่อไปนี้

คอนโซล Firebase
  1. ในคอนโซล Firebase ให้ไปที่หน้าฐานข้อมูล Firestore

    ไปที่ฐานข้อมูล Firestore

  2. เลือกฐานข้อมูลจากรายการฐานข้อมูล
  3. ในแท็บดัชนี ให้คลิกสร้างดัชนี
  4. ป้อนรหัสคอลเล็กชัน
  5. เพิ่มเส้นทางฟิลด์อย่างน้อย 1 รายการ แล้วเลือกตัวเลือกดัชนีสำหรับแต่ละรายการ
  6. เลือกตัวเลือกการมีอยู่ของฟิลด์ ซึ่งจะเป็นแบบไม่กระจัดกระจายหรือแบบกระจัดกระจาย
  7. คุณสามารถเลือกตั้งค่าตัวเลือกดัชนีแบบ หลายคีย์ ได้
  8. คลิกสร้าง
  9. ดัชนีใหม่จะปรากฏในรายการดัชนี และ Cloud Firestore จะเริ่มสร้างดัชนี เมื่อสร้างดัชนีแล้ว คุณจะเห็นเครื่องหมายถูกสีเขียวข้างดัชนี หากสร้างดัชนี ไม่ได้ โปรดดูสาเหตุที่เป็นไปได้ที่ข้อผิดพลาดในการสร้างดัชนี
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

ใช้เมธอด dropIndex() เพื่อลบดัชนี เช่น

ลบดัชนีโดยใช้ชื่อดัชนี

db.restaurants.dropIndex("cuisine_index")

ลบดัชนีโดยใช้คำจำกัดความของดัชนี

db.restaurants.dropIndex({"cuisine" : 1})
คอนโซล Firebase
  1. ในคอนโซล Firebase ให้ไปที่หน้าฐานข้อมูล Firestore

    ไปที่ฐานข้อมูล Firestore

  2. เลือกฐานข้อมูลจากรายการฐานข้อมูล
  3. คลิกแท็บดัชนี
  4. ในรายการดัชนี ให้เลือกลบ จากปุ่มเพิ่มเติม สำหรับดัชนีที่ต้องการลบ
  5. คลิกลบดัชนี
gcloud CLI
  1. หากต้องการค้นหาชื่อดัชนี ให้ใช้คำสั่ง gcloud firestore indexes composite list

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

    แทนที่ DATABASE_ID ด้วยรหัสฐานข้อมูล

  2. หากต้องการลบดัชนี ให้ใช้คำสั่ง gcloud firestore indexes composite delete

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

    แทนที่ข้อมูลต่อไปนี้

    • INDEX_NAME: ชื่อดัชนี
    • DATABASE_ID: รหัสฐานข้อมูล

เวลาบิลด์ดัชนี

หากต้องการสร้างดัชนี Cloud Firestore ต้องสร้างดัชนีก่อน แล้วจึงเติมข้อมูลดัชนีด้วยข้อมูลที่มีอยู่ เวลาที่ใช้ในการสร้างดัชนีจะขึ้นอยู่กับปัจจัยต่อไปนี้

  • เวลาบิลด์ขั้นต่ำสำหรับดัชนีคือ 2-3 นาที แม้ว่าจะเป็นฐานข้อมูลที่ว่างเปล่าก็ตาม

  • เวลาที่ใช้ในการเติมข้อมูลดัชนีจะขึ้นอยู่กับปริมาณข้อมูลที่มีอยู่ซึ่งอยู่ในดัชนีใหม่ ยิ่งค่าฟิลด์ตรงกับคำจำกัดความของดัชนีมากเท่าใด เวลาที่ใช้ในการเติมข้อมูลดัชนีก็จะยิ่งนานขึ้นเท่านั้น

จัดการการดำเนินการที่ใช้เวลานาน

การสร้างดัชนีเป็นการ**ดำเนินการที่ใช้เวลานาน** ส่วนต่อไปนี้จะอธิบายวิธีใช้การดำเนินการที่ใช้เวลานานสำหรับดัชนี

หลังจากที่คุณเริ่มสร้างดัชนี Cloud Firestore กำหนด ชื่อที่ไม่ซ้ำกันให้กับการดำเนินการ ชื่อการดำเนินการจะมีคำนำหน้าเป็น projects/PROJECT_ID/databases/DATABASE_ID/operations/, เช่น

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

คุณสามารถละเว้นคำนำหน้าเมื่อระบุชื่อการดำเนินการสำหรับคำสั่ง describe

แสดงรายการการดำเนินการที่ใช้เวลานานทั้งหมด

หากต้องการแสดงรายการการดำเนินการที่ใช้เวลานาน ให้ใช้ gcloud firestore operations list คำสั่ง คำสั่งนี้จะแสดงรายการการดำเนินการที่กำลังดำเนินการอยู่และการดำเนินการที่เพิ่งเสร็จสมบูรณ์ ระบบจะแสดงรายการการดำเนินการเป็นเวลา 2-3 วันหลังจากเสร็จสมบูรณ์

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 ไว้ในการตอบกลับ แสดงว่าการดำเนินการยังไม่เสร็จสมบูรณ์