จัดการดัชนี

เกี่ยวข้องกับ Cloud Firestore Enterprise Edition เท่านั้น

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

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

ก่อนที่จะสร้างดัชนีใน 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

ใช้เมธอด 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 ที่เข้ากันได้กับ 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

ใช้เมธอด 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 ที่มีความเข้ากันได้กับ MongoDB ต้องสร้างดัชนีแล้ว ป้อนข้อมูลดัชนีย้อนหลังด้วยข้อมูลที่มีอยู่ เวลาที่ใช้ในการสร้างดัชนีจะขึ้นอยู่กับปัจจัยต่อไปนี้

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

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

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

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

หลังจากเริ่มสร้างดัชนีแล้ว Cloud Firestore ที่มีความเข้ากันได้กับ MongoDB จะกำหนดชื่อที่ไม่ซ้ำกันให้กับการดำเนินการ ชื่อการดำเนินการจะมีคำนำหน้าเป็น 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 ในการตอบกลับ แสดงว่าการดำเนินการยังไม่เสร็จสมบูรณ์