Quản lý chỉ mục

Trang này mô tả cách quản lý chỉ mục. Để tìm hiểu thêm về chỉ mục, hãy xem bài viết Tổng quan về chỉ mục.

Trước khi bắt đầu

Trước khi có thể tạo chỉ mục trong Cloud Firestore, hãy đảm bảo rằng bạn được chỉ định một trong các vai trò sau:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Để cấp một vai trò, hãy xem bài viết Cấp một vai trò. Để biết thêm thông tin về các vai trò Cloud Firestore và quyền liên quan, hãy xem bài viết Các vai trò được xác định trước.

Nếu bạn đã xác định các vai trò tuỳ chỉnh, hãy chỉ định tất cả các quyền sau đây để tạo chỉ mục:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Tạo chỉ mục

Để tạo chỉ mục, hãy hoàn tất các bước sau:

MongoDB API

Sử dụng phương thức createIndex() để tạo chỉ mục. Ví dụ:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • Việc tạo chỉ mục bằng db.runCommand() cũng được hỗ trợ với tối đa một chỉ mục.

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

Lưu ý các giới hạn sau:

  • Bạn chỉ có thể tạo một chỉ mục cho mỗi yêu cầu. db.collection.createIndexes() không được hỗ trợ.
  • Nhật ký kiểm tra để tạo chỉ mục bằng MongoDB API sử dụng tên phương thức google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Để biết các tuỳ chọn chỉ mục được hỗ trợ, hãy xem bài viết chỉ mục và thuộc tính chỉ mục.
Bảng điều khiển Firebase
  1. Trong bảng điều khiển Firebase, hãy chuyển đến trang Cơ sở dữ liệu Firestore.

    Chuyển đến Cơ sở dữ liệu Firestore

  2. Chọn một cơ sở dữ liệu trong danh sách cơ sở dữ liệu.
  3. Trong thẻ Chỉ mục, hãy nhấp vào Tạo chỉ mục.
  4. Nhập Mã bộ sưu tập.
  5. Thêm một hoặc nhiều đường dẫn trường và chọn một tuỳ chọn chỉ mục cho mỗi đường dẫn.
  6. Chọn một tuỳ chọn về sự hiện diện của trường, không thưa thớt hoặc thưa thớt.
  7. Bạn có thể đặt tuỳ chọn chỉ mục nhiều khoá.
  8. Nhấp vào Tạo.
  9. Chỉ mục mới của bạn sẽ xuất hiện trong danh sách chỉ mục và Cloud Firestore bắt đầu tạo chỉ mục. Khi chỉ mục được tạo, bạn sẽ thấy dấu kiểm màu xanh lục bên cạnh chỉ mục. Nếu chỉ mục không được tạo, hãy xem bài viết Lỗi xây dựng chỉ mục để biết các nguyên nhân có thể.
gcloud CLI

Để tạo chỉ mục, hãy sử dụng gcloud firestore indexes composite create lệnh. Đặt api-scope thành 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

Thay thế các nội dung sau:

  • DATABASE_ID: mã cơ sở dữ liệu.
  • COLLECTION: tên bộ sưu tập.
  • FIELD_CONFIGURATION: cấu hình trường. Đối với mỗi trường, hãy thêm --field-config=field-path=. Ví dụ:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Để biết thêm thông tin về cách định cấu hình các trường này, hãy xem bài viết --field-config.

Để tạo chỉ mục thưa thớt, hãy đặt --density=sparse-any.

Để tạo chỉ mục nhiều khoá, hãy thêm cờ --multikey.

Để tạo chỉ mục duy nhất, hãy thêm cờ --unique.

Terraform

Sử dụng tài nguyên google_firestore_index và đặt api_scope thành MONGODB_COMPATIBLE_APIquery_scope thành 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"
}

Thay thế các nội dung sau:

  • DATABASE_ID: Mã cơ sở dữ liệu cho cơ sở dữ liệu bạn chọn
  • COLLECTION: Tên của bộ sưu tập cần lập chỉ mục
  • FIELD_PATH: Tên của trường cần lập chỉ mục
  • ORDER: Một trong các giá trị ASCENDING hoặc DESCENDING
  • DENSITY: Một trong các giá trị SPARSE_ANY hoặc DENSE

Xoá chỉ mục

Để xoá chỉ mục, hãy hoàn tất các bước sau:

MongoDB API

Sử dụng phương thức dropIndex() để xoá chỉ mục. Ví dụ:

Xoá chỉ mục bằng tên chỉ mục

db.restaurants.dropIndex("cuisine_index")

Xoá chỉ mục bằng định nghĩa chỉ mục

db.restaurants.dropIndex({"cuisine" : 1})
Bảng điều khiển Firebase
  1. Trong bảng điều khiển Firebase, hãy chuyển đến trang Cơ sở dữ liệu Firestore.

    Chuyển đến Cơ sở dữ liệu Firestore

  2. Chọn một cơ sở dữ liệu trong danh sách cơ sở dữ liệu.
  3. Nhấp vào thẻ Chỉ mục.
  4. Trong danh sách chỉ mục, hãy chọn Xoá trong nút Tuỳ chọn khác cho chỉ mục bạn muốn xoá.
  5. Nhấp vào Xoá chỉ mục.
gcloud CLI
  1. Để tìm tên của chỉ mục, hãy sử dụng lệnh gcloud firestore indexes composite list.

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

    Thay thế DATABASE_ID bằng mã cơ sở dữ liệu.

  2. Để xoá chỉ mục, hãy sử dụng lệnh gcloud firestore indexes composite delete.

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

    Thay thế các nội dung sau:

    • INDEX_NAME: tên của một chỉ mục
    • DATABASE_ID: mã cơ sở dữ liệu

Thời gian xây dựng chỉ mục

Để xây dựng chỉ mục, Cloud Firestore phải tạo chỉ mục, sau đó điền lại các mục chỉ mục bằng dữ liệu hiện có. Thời gian cần thiết để tạo chỉ mục được xác định bởi các yếu tố sau:

  • Thời gian xây dựng tối thiểu cho một chỉ mục là vài phút, ngay cả đối với cơ sở dữ liệu trống.

  • Thời gian cần thiết để điền lại các mục chỉ mục phụ thuộc vào lượng dữ liệu hiện có thuộc về chỉ mục mới. Càng có nhiều giá trị trường khớp với định nghĩa chỉ mục thì thời gian điền lại các mục chỉ mục càng lâu.

Quản lý các thao tác chạy trong thời gian dài

Việc xây dựng chỉ mục là các thao tác chạy trong thời gian dài. Các phần sau đây mô tả cách làm việc với các thao tác chạy trong thời gian dài cho chỉ mục.

Sau khi bạn bắt đầu tạo chỉ mục, Cloud Firestore sẽ gán cho thao tác đó một tên duy nhất. Tên thao tác có tiền tố là projects/PROJECT_ID/databases/DATABASE_ID/operations/, ví dụ:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Bạn có thể bỏ qua tiền tố khi chỉ định tên thao tác cho lệnh describe.

Liệt kê tất cả các thao tác chạy trong thời gian dài

Để liệt kê các thao tác chạy trong thời gian dài, hãy sử dụng gcloud firestore operations list lệnh. Lệnh này liệt kê các thao tác đang diễn ra và các thao tác đã hoàn tất gần đây. Các thao tác được liệt kê trong vài ngày sau khi hoàn tất:

gcloud firestore operations list

Kiểm tra trạng thái thao tác

Thay vì liệt kê tất cả các thao tác chạy trong thời gian dài, bạn có thể liệt kê thông tin chi tiết của một thao tác:

gcloud firestore operations describe operation-name

Ước tính thời gian hoàn tất

Khi thao tác của bạn chạy, hãy xem giá trị của trường state để biết trạng thái tổng thể của thao tác.

Yêu cầu về trạng thái của một thao tác chạy trong thời gian dài cũng trả về các chỉ số workEstimatedworkCompleted. workEstimated cho biết tổng số tài liệu ước tính mà một thao tác sẽ xử lý. workCompleted cho biết số lượng tài liệu đã xử lý cho đến nay. Sau khi thao tác hoàn tất, workCompleted phản ánh tổng số tài liệu đã được xử lý thực tế, có thể khác với giá trị của workEstimated.

Để ước tính tiến trình của một thao tác, hãy chia workCompleted cho workEstimated.

Sau đây là ví dụ về tiến trình tạo chỉ mục:

{
  "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"
        }
       },
    },
    ...

Khi một thao tác hoàn tất, phần mô tả thao tác sẽ chứa "done": true. Xem giá trị của trường state để biết kết quả của thao tác. Nếu trường done không được đặt trong phản hồi, thì thao tác chưa hoàn tất.