MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB Multikey Indexes &Index Intersection Bounds

MongoDB hỗ trợ tuyệt vời cho các mảng và mang lại nhiều tính linh hoạt trong chế độ tài liệu của bạn. Ví dụ:bạn có thể nhúng mảng trong tài liệu và cũng có thể nhúng tài liệu vào mảng, v.v. Tuy nhiên, làm việc với mảng có một số gotcha’s trong MongoDB. Trong bài đăng này, chúng ta sẽ xem xét một số vấn đề mà MongoDB gặp phải với chỉ mục và mảng.

Chỉ mục đa khóa

Trong MongoDB, bạn có thể lập chỉ mục một trường mảng để tạo mục nhập chỉ mục cho mỗi phần tử trong mảng. Chỉ mục kết quả được gọi là chỉ mục 'multikey'. Chỉ mục multikey có thể được tạo trên các giá trị vô hướng hoặc tài liệu nhúng. Để biết thêm thông tin về các chỉ mục đa khóa, hãy tham khảo tài liệu này.

Chỉ mục đa khóa, mặc dù hữu ích, có một số hạn chế:

  • Nếu bạn tạo chỉ mục nhiều khóa kết hợp, thì bạn có ít nhất một trường là mảng.
  • Một chỉ mục kết hợp không được là một khóa phân đoạn.
  • Một chỉ mục kết hợp không thể là một chỉ mục được băm.
Hạn chế của chỉ mục đa khóa MongoDB - Cần lưu ý điều gì trong các truy vấn của bạnNhấp vào Tweet

Một trong những khía cạnh thú vị nhất của chỉ mục đa khóa là cách tính các giới hạn của giao điểm chỉ mục.

Ranh giới giao nhau của chỉ mục

Đây là cách tài liệu MongoDB xác định chỉ mục giao nhau giới hạn:

“Các giới hạn của quá trình quét chỉ mục xác định các phần của chỉ mục để tìm kiếm trong một truy vấn. Khi tồn tại nhiều vị từ trên một chỉ mục, MongoDB sẽ cố gắng kết hợp các giới hạn cho các vị từ này theo giao nhau hoặc lãi kép để tạo ra một bản quét với giới hạn nhỏ hơn. ”

Truy vấn phạm vi trên Mảng

Hãy bắt đầu với một ví dụ đơn giản để xem cách MongoDB tính toán giới hạn chỉ mục cho các truy vấn trên mảng. Giả sử chúng ta có ba tài liệu sau trong một bộ sưu tập:

 {x:65} {x:35} {x:[12,95]} 

Chúng tôi đưa ra truy vấn sau:

 db.coll.find ({x:{$ gt:22, $ lt:55}) 

Truy vấn đủ đơn giản. Bạn mong đợi câu trả lời là {x:35} nhưng truy vấn trả về:

 {x:35} {x:[25,95]} 

Lý do đến từ cách MongoDB xử lý các mảng. Phần tử giống nhau của mảng không cần phải phù hợp với cả hai điều kiện; miễn là có một phần tử phù hợp với từng điều kiện, thì phần tử đó sẽ phù hợp. Vì vậy, trong trường hợp này, các giới hạn là [22, Infinity] và [-Infinity, 55]. Vì toán tử ‘elemMatch’ không được sử dụng, MongoDB không sử dụng giao điểm chỉ mục. MongoDB không chỉ định phạm vi nào trong số này [22, Infinity] hoặc [-Infinity, 55] sẽ được sử dụng để thực hiện truy vấn.

Nếu chúng ta muốn sử dụng giao điểm chỉ mục, thì chúng ta cần sử dụng truy vấn sau:

 db.coll.find (x:{$ elemMatch:{$ gt:22, $ lt:55}}) 

Khi bạn sử dụng điều này, MongoDB sẽ cắt các giới hạn chỉ mục và sử dụng [22, 55] làm giới hạn. Như mong đợi, truy vấn này không trả lại bất kỳ kết quả nào (elemMatch không khớp với các mảng không phải). Vì vậy, về cơ bản, các truy vấn phạm vi trên mảng khá vô dụng nếu không có toán tử $ elemMatch.

Chỉ mục đa khóa kết hợp - Trộn các trường mảng và trường không phải mảng

Hãy xem xét một bộ sưu tập với các tài liệu sau:

 {item:35, giá:[250,35]} ...... {item:106, giá:[1500,65]} 

Chúng tôi sẽ thêm một chỉ mục tổng hợp vào bộ sưu tập này:

 db.ensureIndex ({item:1, giá:1}); 

Bây giờ, hãy chạy một truy vấn đơn giản:

 db. đối chiếu. tìm ({item:{$ gt:12, $ lt:65}}); 

Truy vấn trông đủ đơn giản vì chúng tôi đang sử dụng một mục không phải là mảng với một phạm vi cố định. Tôi mong đợi các giới hạn giao nhau của Chỉ mục là một cái gì đó giống như mục:[[12,65]] cho truy vấn, tuy nhiên, nếu bạn chạy giải thích, bạn sẽ thấy điều này:

 "indexBounds":{"item":[[-Infinity, 65]], "price":[[{"$ minElement":1}, {"$ maxElement":1}]]},  

Lý do là MongoDB phát hiện rằng đây là một chỉ mục đa khóa và không xử lý giao điểm giới hạn chỉ mục, bất kể thực tế là truy vấn của bạn không sử dụng bất kỳ trường mảng nào. Cốt lõi của câu chuyện là khi bạn trộn các trường mảng và trường không phải mảng trong một chỉ mục, hãy luôn theo dõi giới hạn giao điểm chỉ mục của bạn. Tỷ lệ cược là nó không hiệu quả.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. đẩy giá trị mới vào mảng bên trong mongodb - mongodb / php

  2. Làm thế nào để thực hiện các hoạt động mongodb thô trong mongoose?

  3. Trả về kiểu thực tế của một trường trong MongoDB

  4. MongoDB $ trim

  5. Cách quản lý người dùng và xác thực trong MongoDB