Hướng dẫn partial index mongodb - chỉ mục một phần mongodb

Tài liệu về nhà → Hướng dẫn sử dụng MongoDBMongoDB Manual

Chỉ mục một phần chỉ lập chỉ mục các tài liệu trong một bộ sưu tập đáp ứng biểu thức bộ lọc được chỉ định. Bằng cách lập chỉ mục một tập hợp con của các tài liệu trong một bộ sưu tập, các chỉ mục một phần có yêu cầu lưu trữ thấp hơn và giảm chi phí hiệu suất để tạo và bảo trì chỉ số.

Để tạo chỉ mục

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
7, hãy sử dụng phương thức
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
8 với tùy chọn
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
9. Tùy chọn
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
9 chấp nhận một tài liệu chỉ định điều kiện bộ lọc bằng cách sử dụng:

  • Biểu thức bình đẳng (tức là

    db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    1 hoặc sử dụng toán tử

    db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    2),

  • db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    3 Biểu thức,

  • db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    4,

    db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    5,

    db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    6,

    db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    7,

  • db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    8 Biểu thức,

  • Nhà điều hành

    db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

    9,

  • Nhà điều hành

    db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

    0,

  • Nhà điều hành

    db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

    1

Ví dụ: thao tác sau đây tạo ra một chỉ số ghép chỉ lập chỉ mục các tài liệu có trường

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

2 lớn hơn 5.

db.restaurants.createIndex(
{ cuisine: 1, name: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)

Bạn có thể chỉ định tùy chọn

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
9 cho tất cả các loại chỉ mục MongoDB.

Mẹo

Xem thêm:

Để tìm hiểu cách quản lý các chỉ mục trong La bàn MongoDB, hãy xem Quản lý các chỉ mục.

MongoDB sẽ không sử dụng chỉ mục một phần cho hoạt động truy vấn hoặc sắp xếp nếu sử dụng chỉ số kết quả trong tập kết quả không đầy đủ.

Để sử dụng chỉ mục một phần, truy vấn phải chứa biểu thức bộ lọc (hoặc biểu thức bộ lọc được sửa đổi chỉ định một tập hợp con của biểu thức bộ lọc) là một phần của điều kiện truy vấn của nó.

Ví dụ, được đưa ra chỉ số sau:

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)

Truy vấn sau đây có thể sử dụng chỉ mục vì vị từ truy vấn bao gồm điều kiện

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

4 khớp với một tập hợp con của các tài liệu được khớp với biểu thức bộ lọc chỉ mục

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

5:

db.restaurants.find( { cuisine: "Italian", rating: { $gte: 8 } } )

Tuy nhiên, truy vấn sau không thể sử dụng chỉ mục một phần trên trường

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

6 vì sử dụng chỉ số kết quả trong tập kết quả không đầy đủ. Cụ thể, vị từ truy vấn bao gồm điều kiện

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

7 trong khi chỉ mục có bộ lọc

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

8. Đó là, truy vấn

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

9 phù hợp với nhiều tài liệu hơn (ví dụ: một nhà hàng Ý có xếp hạng bằng 1) so với được lập chỉ mục.

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

Tương tự, truy vấn sau không thể sử dụng chỉ mục một phần vì vị từ truy vấn không bao gồm biểu thức bộ lọc và sử dụng chỉ mục sẽ trả về một tập kết quả không đầy đủ.

db.restaurants.find( { cuisine: "Italian" } )

Các chỉ mục một phần nên được ưu tiên hơn các chỉ mục thưa thớt. Chỉ số một phần cung cấp các lợi ích sau:

  • Kiểm soát lớn hơn đối với tài liệu nào được lập chỉ mục.

  • Một siêu chất của chức năng được cung cấp bởi các chỉ mục thưa thớt.

Các chỉ mục thưa thớt chọn các tài liệu để chỉ số chỉ dựa trên sự tồn tại của trường được lập chỉ mục hoặc cho các chỉ mục hợp chất, sự tồn tại của các trường được lập chỉ mục.

Các chỉ mục một phần xác định các mục nhập chỉ mục dựa trên bộ lọc được chỉ định. Bộ lọc có thể bao gồm các trường khác ngoài các khóa chỉ mục và có thể chỉ định các điều kiện khác ngoài việc kiểm tra sự tồn tại. Ví dụ, một chỉ mục một phần có thể thực hiện hành vi tương tự như chỉ mục thưa thớt:

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)

Chỉ số một phần này hỗ trợ các truy vấn tương tự như chỉ số thưa thớt trên trường

db.restaurants.find( { cuisine: "Italian" } )

0.

Tuy nhiên, một chỉ mục một phần cũng có thể chỉ định các biểu thức bộ lọc trên các trường khác với khóa chỉ mục. Ví dụ: thao tác sau đây tạo ra một chỉ mục một phần, trong đó chỉ mục trên trường

db.restaurants.find( { cuisine: "Italian" } )

0 nhưng biểu thức bộ lọc nằm trên trường

db.restaurants.find( { cuisine: "Italian" } )

2:

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)

Để trình tối ưu hóa truy vấn chọn chỉ mục một phần này, vị từ truy vấn phải bao gồm một điều kiện trên trường

db.restaurants.find( { cuisine: "Italian" } )

0 cũng như một trận đấu không null trên trường

db.restaurants.find( { cuisine: "Italian" } )

2.

Ví dụ: truy vấn sau có thể sử dụng chỉ mục vì nó bao gồm cả điều kiện trên trường

db.restaurants.find( { cuisine: "Italian" } )

0 và khớp không null trên trường

db.restaurants.find( { cuisine: "Italian" } )

2:

db.contacts.find( { name: "xyz", email: { $regex: /\.org$/ } } )

Tuy nhiên, truy vấn sau không thể sử dụng chỉ mục vì nó bao gồm một khớp null trên trường

db.restaurants.find( { cuisine: "Italian" } )

2, không được phép bởi biểu thức bộ lọc

db.restaurants.find( { cuisine: "Italian" } )

8:

db.contacts.find( { name: "xyz", email: { $exists: false } } )

Bắt đầu từ MongoDB 5.0, nhiều chỉ mục một phần có thể được tạo bằng cách sử dụng cùng một mẫu khóa miễn là các trường PartialFilterExpression không thể hiện các bộ lọc tương đương.

Trong các phiên bản trước của MongoDB, việc tạo ra nhiều chỉ mục một phần không được phép khi sử dụng cùng một mẫu khóa với các phần khác nhau.

Bạn không thể chỉ định cả tùy chọn

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
9 và tùy chọn
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
0.

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
1 Các chỉ mục không thể là chỉ số một phần.

Các chỉ số khóa của Shard không thể là chỉ số một phần.

Xem xét một bộ sưu tập

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
2 chứa các tài liệu giống như

{
"_id" : ObjectId("5641f6a7522545bc535b5dc9"),
"address" : {
"building" : "1007",
"coord" : [
-73.856077,
40.848447
],
"street" : "Morris Park Ave",
"zipcode" : "10462"
},
"borough" : "Bronx",
"cuisine" : "Bakery",
"rating" : { "date" : ISODate("2014-03-03T00:00:00Z"),
"grade" : "A",
"score" : 2
},
"name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445"
}

Bạn có thể thêm một chỉ mục một phần trên các trường

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
3 và

db.restaurants.find( { cuisine: "Italian", rating: { $lt: 8 } } )

6 chỉ chọn vào các tài liệu chỉ mục trong đó trường
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
5 là
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
6:

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
0

Sau đó, truy vấn sau đây trên bộ sưu tập

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
2 sử dụng chỉ số một phần để trả lại các nhà hàng ở khu vực Bronx với
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
5 bằng
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
6:

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
1

Tuy nhiên, truy vấn sau không thể sử dụng chỉ mục một phần vì biểu thức truy vấn không bao gồm trường

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
5:

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
2

Chỉ mục một phần chỉ lập chỉ mục các tài liệu trong một bộ sưu tập đáp ứng biểu thức bộ lọc được chỉ định. Nếu bạn chỉ định cả

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
9 và ràng buộc duy nhất, ràng buộc duy nhất chỉ áp dụng cho các tài liệu đáp ứng biểu thức bộ lọc. Một chỉ số một phần với một ràng buộc duy nhất không ngăn chặn việc chèn các tài liệu không đáp ứng các ràng buộc duy nhất nếu các tài liệu không đáp ứng các tiêu chí lọc.

Ví dụ: Bộ sưu tập

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)
2 chứa các tài liệu sau:

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
3

Hoạt động sau đây tạo ra một chỉ mục chỉ định một ràng buộc duy nhất trên trường

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)
3 và biểu thức bộ lọc một phần
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)
4.

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
4

Chỉ số ngăn chặn việc chèn các tài liệu sau vì các tài liệu đã tồn tại với các tên người dùng được chỉ định và các trường

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)
5 lớn hơn
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)
6:

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
5

Tuy nhiên, các tài liệu sau đây có tên người dùng trùng lặp được cho phép vì ràng buộc duy nhất chỉ áp dụng cho các tài liệu có

db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { email: { $exists: true } } }
)
5 lớn hơn hoặc bằng 21.

db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
6