Tổng quan về truy vấn có bộ lọc phạm vi và bất đẳng thức trên nhiều trường

Cloud Firestore hỗ trợ sử dụng các bộ lọc phạm vi và bất đẳng thức trên nhiều trường trong một truy vấn. Giờ đây, bạn có thể có phạm vi và điều kiện bất bình đẳng trên nhiều trường và đơn giản hoá phát triển ứng dụng bằng cách uỷ quyền triển khai logic sau lọc cho Cloud Firestore.

Bộ lọc phạm vi và bất đẳng thức trên nhiều trường

Truy vấn sau trả về tất cả người dùng có độ tuổi là lớn hơn 35 và chiều cao từ 60 đến 70 bằng cách sử dụng các bộ lọc phạm vi về độ tuổi và chiều cao.

Mô-đun phiên bản web 9

  const q = query(
      collection(db, "users"),
      where('age', '>', 35),
      where('height', '>', 60),
      where('height', '<', 70)
    );

Swift

 let query = db.collection("users")
   .whereField("age", isGreaterThan: 35)
   .whereField("height", isGreaterThan: 60)
   .whereField("height", isLessThan: 70)

Objective-C

 FIRQuery *query = 
  [[[[self.db collectionWithPath:@"users"]
 queryWhereField:@"age" isGreaterThan:@35]
    queryWhereField:@"height" isGreaterThan:@60] 
        queryWhereField:@"height" isLessThan:@70];

Android Java

 Query query = db.collection("users")
  .whereGreaterThan("age", 35)
  .whereGreaterThan("height", 60)
  .whereLessThan("height", 70);

Kotlin+KTX cho Android

 val query = db.collection("users")
  .whereGreaterThan("age", 35)
  .whereGreaterThan("height", 60)
  .whereLessThan("height", 70)

Java

  db.collection("users")
    .whereGreaterThan("age", 35)
    .whereGreaterThan("height", 60)
    .whereLessThan("height", 70);

Node.js

db.collection("users")
  .where('age', '>', 35),
  .where('height', '>', 60),
  .where('height', '<', 70)

Những điều cần cân nhắc khi lập chỉ mục

Trước khi bắt đầu chạy truy vấn, hãy đảm bảo bạn đã đọc về truy vấnmô hình dữ liệu của Cloud Firestore.

Trong Cloud Firestore, mệnh đề ORDER BY của truy vấn xác định chỉ mục nào có thể được sử dụng để phân phát truy vấn. Ví dụ: truy vấn ORDER BY a ASC, b ASC yêu cầu chỉ mục tổng hợp trên các trường a ASC, b ASC.

Để tối ưu hoá hiệu suất và chi phí của các truy vấn trên Cloud Firestore, bạn nên tối ưu hoá thứ tự các trường trong chỉ mục. Để thực hiện điều này, bạn phải đảm bảo rằng chỉ mục của mình được sắp xếp theo thứ tự từ trái đến sao cho truy vấn chuyển sang tập dữ liệu ngăn chặn việc quét các mục nhập chỉ mục không liên quan.

Giả sử bạn muốn tìm kiếm trong một nhóm các nhân viên và tìm nhân viên có mức lương trên 100.000 và số năm kinh nghiệm là lớn hơn 0. Dựa trên hiểu biết của mình về tập dữ liệu, bạn biết rằng ràng buộc về tiền lương mang tính lựa chọn hơn so với ràng buộc về kinh nghiệm. Lý tưởng chỉ mục giúp giảm số lần quét chỉ mục sẽ là (salary [...], experience [...]). Do đó, một truy vấn nhanh và tiết kiệm chi phí sẽ đặt hàng salary trước experience và có dạng như sau:

Java

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("salary")
  .orderBy("experience");

Node.js

db.collection("employees")
  .where("salary", ">", 100000)
  .where("experience", ">", 0)
  .orderBy("salary")
  .orderBy("experience");

Python

db.collection("employees")
  .where("salary", ">", 100000)
  .where("experience", ">", 0)
  .order_by("salary")
  .order_by("experience");

Các phương pháp hay nhất để tối ưu hoá chỉ mục

Khi tối ưu hoá các chỉ mục, hãy lưu ý những phương pháp hay nhất sau đây.

Các trường chỉ mục thứ tự bằng các trường bằng nhau, theo sau là trường phạm vi hoặc trường bất đẳng thức có chọn lọc nhất

Cloud Firestore sử dụng các trường ngoài cùng bên trái của một chỉ mục tổng hợp để đáp ứng giới hạn bằng đẳng thức và ràng buộc phạm vi hoặc bất đẳng thức (nếu có) trên trường đầu tiên của truy vấn orderBy(). Những ràng buộc này có thể làm giảm số lượng chỉ mục các mục nhập mà Cloud Firestore quét. Cloud Firestore sử dụng các trường còn lại của chỉ mục để đáp ứng những ràng buộc khác về phạm vi hoặc bất đẳng thức của truy vấn. Các những quy tắc ràng buộc không làm giảm số lượng mục nhập chỉ mục mà Cloud Firestore quét nhưng lọc ra những tài liệu không khớp để số lượng tài liệu trả về cho khách hàng đều bị giảm.

Để biết thêm thông tin về cách tạo chỉ mục hiệu quả, hãy xem định nghĩa về chỉ mục hoàn hảo.

Các trường thứ tự theo thứ tự giảm dần của tính chọn lọc giới hạn truy vấn

Để đảm bảo rằng Cloud Firestore chọn chỉ mục tối ưu cho truy vấn của bạn, chỉ định mệnh đề orderBy() sắp xếp các trường theo thứ tự giảm dần của truy vấn hạn chế chọn lọc. Độ chọn lọc cao hơn phù hợp với một tập con nhỏ hơn tài liệu, trong khi độ chọn lọc thấp hơn phù hợp với một nhóm nhỏ tài liệu lớn hơn. Đảm bảo rằng bạn chọn các trường phạm vi hoặc bất bình đẳng có độ chọn lọc cao hơn trước đó trong chỉ mục thứ tự khác với các trường có độ chọn lọc thấp hơn.

Để giảm thiểu số lượng tài liệu mà Cloud Firestore quét và trả lại mạng, bạn phải luôn sắp xếp các trường theo thứ tự giảm dần của truy vấn hạn chế chọn lọc. Nếu tập hợp kết quả không theo thứ tự yêu cầu và tập hợp kết quả dự kiến sẽ nhỏ, bạn có thể triển khai logic phía máy khách để đặt lại đơn hàng theo mong muốn của bạn khi đặt hàng.

Ví dụ: giả sử bạn muốn tìm kiếm qua một nhóm các nhân viên để tìm nhân viên có mức lương cao hơn 100.000 và sắp xếp kết quả theo năm kinh nghiệm của nhân viên. Nếu bạn dự kiến chỉ có một số ít nhân viên có mức lương lớn hơn 100000, thì cách hiệu quả nhất để viết truy vấn như sau:

Java

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .orderBy("salary")
  .get()
  .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
          // Order results by `experience`
        }
    });;

Node.js

const querySnapshot = await db.collection('employees')
                              .where("salary", ">", 100000)
                              .orderBy("salary")
                              .get();

// Order results by `experience`

Python

results = db.collection("employees")
            .where("salary", ">", 100000)
            .order_by("salary")
            .stream()

// Order results by `experience`

Mặc dù việc thêm thứ tự trên experience vào truy vấn sẽ mang lại cùng một nhóm tài liệu và sắp xếp lại thứ tự các kết quả trên máy khách, thì truy vấn có thể đọc nhiều mục nhập chỉ mục không liên quan hơn truy vấn trước đó. Điều này là do Cloud Firestore luôn ưu tiên một chỉ mục có tiền tố các trường chỉ mục khớp với thứ tự theo mệnh đề của truy vấn. Nếu experience được thêm vào thứ tự theo mệnh đề, thì Cloud Firestore sẽ chọn chỉ mục (experience [...], salary [...]) để tính toán kết quả truy vấn. Vì không có hạn chế nào khác đối với experience, Cloud Firestore sẽ đọc tất cả các mục trong chỉ mục của Bộ sưu tập employees trước khi áp dụng bộ lọc salary để tìm kết quả cuối cùng bộ kết quả. Điều này có nghĩa là các mục nhập chỉ mục không đáp ứng salary vẫn được đọc, do đó làm tăng độ trễ và chi phí của truy vấn.

Giá

Các truy vấn có bộ lọc phạm vi và bất đẳng thức trên nhiều trường sẽ được lập hoá đơn dựa trên tài liệu đã đọc và lập chỉ mục các mục đã đọc.

Để biết thông tin chi tiết, hãy xem trang Định giá.

Các điểm hạn chế

Ngoài giới hạn đối với truy vấn, hãy lưu ý các giới hạn sau trước khi sử dụng các truy vấn có bộ lọc phạm vi và bất đẳng thức trên nhiều trường:

  • Các truy vấn có bộ lọc phạm vi hoặc bất đẳng thức trên các trường tài liệu và chỉ có giá trị bằng nhau các điều kiện ràng buộc trên khoá tài liệu (__name__) không được hỗ trợ.
  • Cloud Firestore giới hạn số lượng trường phạm vi hoặc trường bất đẳng thức ở mức 10. Điều này giúp tránh việc truy vấn trở nên quá tốn kém để chạy.

Bước tiếp theo