Quản lý chỉ mục

Chỉ áp dụng cho phiên bản Cloud Firestore Enterprise.

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 có khả năng tương thích với MongoDB, 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 vai trò, hãy xem phần 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 phần Vai trò được xác định trước.

Nếu bạn đã xác định vai trò tuỳ chỉnh, hãy chỉ định tất cả các quyền sau để 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 một 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 một 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"}]})
      

Hãy 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 lựa chọn chỉ mục được hỗ trợ, hãy xem phần chỉ mục và thuộc tính chỉ mục.
Firebase bảng điều khiển
  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 đến trường và chọn một lựa chọn chỉ mục cho từng đường dẫn.
  6. Chọn một lựa chọn về sự hiện diện của trường, có thể là không thưa thớt hoặc thưa thớt.
  7. Bạn có thể đặt lựa chọn chỉ mục nhiều khoá (không bắt buộc).
  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 có khả năng tương thích với MongoDB sẽ 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 phần Lỗi tạo chỉ mục để biết các nguyên nhân có thể xảy ra.
gcloud CLI

Để tạo một chỉ mục, hãy dùng lệnh gcloud firestore indexes composite create. Đặ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ế nội dung sau:

  • DATABASE_ID: mã nhận dạng cơ sở dữ liệu.
  • COLLECTION: tên của một bộ sưu tập.
  • FIELD_CONFIGURATION: một 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 phần --field-config.

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

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

Để tạo một 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ế 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 số ASCENDING hoặc DESCENDING
  • DENSITY: Một trong số SPARSE_ANY hoặc DENSE

Xoá chỉ mục

Để xoá một 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á một 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})
Firebase bảng điều khiển
  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 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 dùng lệnh gcloud firestore indexes composite delete.

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

    Thay thế nội dung sau:

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

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

Để tạo chỉ mục, Cloud Firestore có khả năng tương thích với MongoDB 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 một chỉ mục được xác định bằng những yếu tố sau:

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

  • Thời gian cần thiết để bổ sung các mục nhập chỉ mục phụ thuộc vào lượng dữ liệu hiện có thuộc 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 nhập chỉ mục càng lâu.

Quản lý các thao tác diễn ra trong thời gian dài

Quá trình tạo chỉ mục là các thao tác diễn ra trong thời gian dài. Các phần sau đây mô tả cách xử lý các hoạt động diễn ra trong thời gian dài đối với chỉ mục.

Sau khi bạn bắt đầu tạo một chỉ mục, Cloud Firestore có khả năng tương thích với MongoDB sẽ chỉ định 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 diễn ra trong thời gian dài

Để liệt kê các thao tác diễn ra trong thời gian dài, hãy sử dụng lệnh gcloud firestore operations list. 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 sẽ đượ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 hoạt động

Thay vì liệt kê tất cả các thao tác diễn ra 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 duy nhất:

gcloud firestore operations describe operation-name

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

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 diễn ra 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 thời điểm hiện tại. Sau khi thao tác hoàn tất, workCompleted sẽ phản ánh tổng số tài liệu thực sự được xử lý, 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, nội dung 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 bạn không đặt trường done trong phản hồi, thì thao tác chưa hoàn tất.