Chỉ mục duy nhất một phần MongoDB

Tôi đang cố gắng tạo một chỉ mục duy nhất trên hai trường trong một tài liệu, nhưng chỉ khi trường thứ hai không rỗng. Điều này hơi phức tạp vì partial_filter_expression có hỗ trợ toán tử hạn chế và không hỗ trợ phủ định

Tôi đã nghĩ ra ba cách khác nhau và tôi không chắc cách nào là tốt nhất. Giả sử các trường quan tâm là first_name và last_name. Tôi muốn bỏ qua chỉ mục duy nhất nếu last_name là null

1) Xử lý trước tài liệu một chút trong mã ứng dụng trước khi chèn vào MongoDB để đảm bảo rằng trường last_name không được tạo nếu trường đó là null. Trong trường hợp này tôi có thể làm

partial_filter_expression. {họ. {'$ tồn tại'. ĐÚNG VẬY}}

2) Lọc theo loại trường, vì last_name sẽ luôn là một chuỗi. Điều này sẽ bỏ qua các giá trị null

partial_filter_expression. {họ. {'$type'. 'chuỗi'}}

3) Sử dụng "thủ thuật" để lọc ra các giá trị null bằng cách so sánh các chuỗi

partial_filter_expression. {họ. {'$gt'. ''}}

Tôi nên chọn bộ lọc nào ở trên?

Chỉ mục một phần chỉ lập chỉ mục các tài liệu trong 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à duy trì chỉ mục. Xem để biết thêm thông tin về các chỉ mục một phần và việc sử dụng chúng

Xem thêm

Khái niệm lập chỉ mục và Hướng dẫn lập chỉ mục để biết thêm thông tin

Nguyên mẫu

Để tạo một trường trên, hãy sử dụng tùy chọn partialFilterExpression khi tạo chỉ mục, như sau.

db.collection.createIndex(
   { a: 1 },
   { partialFilterExpression: { b: { $gt: 5 } } }
)

Tùy chọn partialFilterExpression chấp nhận tài liệu chỉ định điều kiện bộ lọc bằng cách sử dụng.

  • biểu thức đẳng thức (i. e. trường. giá trị hoặc sử dụng toán tử),
  • sự diễn đạt,
  • , , , biểu thức,
  • biểu thức,
  • nhà điều hành chỉ ở cấp cao nhất

Thí dụ

Thao tác sau đây tạo một chỉ mục thưa thớt trên bộ sưu tập người dùng chỉ bao gồm một tài liệu trong chỉ mục nếu archived field is false.

db.users.createIndex( { username: 1 }, { archived: false } )

Chỉ mục chỉ bao gồm các tài liệu có trường được lưu trữfalse.

cân nhắc

Ghi chú

Để 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 đã sửa đổi chỉ định một tập hợp con của biểu thức bộ lọc) như một phần của điều kiện truy vấn. Như vậy, MongoDB sẽ không sử dụng chỉ mục một phần nếu chỉ mục dẫn đến một tập hợp kết quả không đầy đủ cho truy vấn hoặc thao tác sắp xếp

←   Tạo một chỉ mục duy nhất Tạo một chỉ mục thưa thớt  →

Trang này có hữu ích không?

có không

Cảm ơn phản hôi của bạn

Chúng tôi xin lỗi. Bạn có thể Báo cáo sự cố để giúp chúng tôi cải thiện trang này

© MongoDB, Inc 2008-2016. MongoDB, Mongo và logo chiếc lá là các nhãn hiệu đã đăng ký của MongoDB, Inc

Vì hai mục nhập không có "biệt hiệu" được chỉ định và việc lập chỉ mục sẽ coi các trường không xác định là null, nên việc tạo chỉ mục sẽ không thành công với 2 tài liệu có "null", vì vậy

db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )

sẽ cho phép bạn vẫn có biệt danh 'null'

Các chỉ mục thưa thớt sẽ nhỏ gọn hơn vì chúng bỏ qua/bỏ qua các tài liệu không chỉ định trường đó. Vì vậy, nếu bạn có một bộ sưu tập chỉ có dưới 10% tài liệu chỉ định trường này, thì bạn có thể tạo các chỉ mục nhỏ hơn nhiều - tận dụng tốt hơn bộ nhớ hạn chế nếu bạn muốn thực hiện các truy vấn như

db.scores.find({'nickname': 'Johnnie'})

chỉ số một phần

Các chỉ mục một phần đại diện cho một siêu chức năng được cung cấp bởi các chỉ mục thưa thớt và nên được ưu tiên hơn các chỉ mục thưa thớt. (Mới trong phiên bản 3. 2)

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

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

Nếu rating lớn hơn 5, thì cuisine sẽ được lập chỉ mục. Có, chúng tôi cũng có thể chỉ định một thuộc tính được lập chỉ mục dựa trên giá trị của các thuộc tính khác

Sự khác biệt giữa các chỉ số thưa thớt và một phần

Các chỉ mục thưa thớt chọn tài liệu để lập chỉ mục chỉ dựa trên sự tồn tại của trường được lập chỉ mục hoặc đối với các chỉ mục phức hợp, sự tồn tại của các trường được lập chỉ mụ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 với khóa chỉ mục và có thể chỉ định các điều kiện khác ngoài việc chỉ kiểm tra sự tồn tại

Tuy nhiên, một chỉ mục một phần có thể thực hiện hành vi tương tự như một chỉ mục thưa thớt

Ví dụ

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

Ghi chú. Không thể chỉ định cả tùy chọn partialFilterExpression và tùy chọn thưa thớt cùng một lúc

Chỉ số duy nhất một phần là gì?

Chỉ mục bộ phận là chỉ mục được xây dựng trên một tập hợp con của bảng ; . Chỉ mục chứa các mục chỉ dành cho những hàng của bảng thỏa mãn vị từ.

Chỉ mục một phần MongoDB là gì?

Chỉ mục một phần chỉ lập chỉ mục các tài liệu trong 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à duy trì chỉ mục.

MongoDB có thể sử dụng một phần của chỉ mục ghép không?

MongoDB hỗ trợ các chỉ mục phức hợp , trong đó một cấu trúc chỉ mục duy nhất chứa các tham chiếu đến nhiều trường [1] trong tài liệu của bộ sưu tập. Sơ đồ sau đây minh họa một ví dụ về chỉ số phức hợp trên hai trường. MongoDB áp đặt giới hạn 32 trường cho bất kỳ chỉ mục phức hợp nào.

Làm cách nào để tạo một phần chỉ mục trong MongoDB Compass?

Để tạo chỉ mục trên bộ sưu tập qua Compass, bộ sưu tập phải chứa tài liệu. .
Nhấp vào nút Tạo chỉ mục. Từ tab Chỉ mục, nhấp vào nút Tạo Chỉ mục để hiển thị hộp thoại Tạo Chỉ mục
Không bắt buộc. Nhập tên chỉ mục. .
Thêm trường vào chỉ mục. Chỉ định một khóa chỉ mục