2011-12-22 6 views
17

Tôi không chắc mình hiểu chỉ mục thưa thớt một cách chính xác.chỉ mục thưa thớt và giá trị null trong mongo

Tôi có một chỉ số duy nhất thưa thớt trên fbId

{ 
    "ns" : "mydb.users", 
    "key" : { 
     "fbId" : 1 
    }, 
    "name" : "fbId_1", 
    "unique" : true, 
    "sparse" : true, 
    "background" : false, 
    "v" : 0 
} 

Và tôi đã mong rằng sẽ cho phép tôi để chèn hồ sơ với null như các fbId, nhưng điều đó ném một ngoại lệ khóa trùng lặp. Nó chỉ cho phép tôi chèn nếu thuộc tính fbId bị xóa hoàn toàn.

Không phải là chỉ mục thưa thớt để giải quyết vấn đề đó?

Trả lời

31

Chỉ mục thưa thớt không chứa tài liệu bỏ qua trường được lập chỉ mục. Tuy nhiên, nếu trường tồn tại và có giá trị là null, trường đó sẽ vẫn được lập chỉ mục. Vì vậy, nếu sự vắng mặt của lĩnh vực và bình đẳng của nó để null trông giống nhau cho ứng dụng của bạn và bạn muốn duy trì tính độc đáo của fbId, chỉ cần không chèn nó cho đến khi bạn có một giá trị cho nó.

Bạn cần chỉ mục thưa thớt khi bạn có nhiều tài liệu, nhưng chỉ một phần nhỏ trong số đó chứa một số trường và bạn muốn có thể tìm nhanh tài liệu theo trường đó. Việc tạo chỉ mục bình thường sẽ quá đắt, bạn sẽ chỉ lãng phí RAM quý giá vào các tài liệu lập chỉ mục mà bạn không quan tâm.

1

Để đảm bảo hiệu suất tối đa của các chỉ mục, chúng tôi có thể bỏ qua việc lập chỉ mục các tài liệu đó mà bạn đang thực hiện một chỉ mục. Để thực hiện điều MongoDB này có tính chất thưa thớt mà làm việc như sau:

db.addresses.ensureIndex({ "secondAddress": 1 }, { sparse: true }); 

Chỉ số này sẽ bỏ qua tất cả các tài liệu không chứa lĩnh vực secondAddress và khi thực hiện một truy vấn, những tài liệu sẽ không bao giờ được quét.

Hãy để tôi chia sẻ bài viết này về các chỉ số cơ bản và một số tài sản của họ:

không gian địa lý, văn bản, chỉ số Hash và đặc tính độc đáo và thưa thớt: http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

1

{a:1, b:5, c:2} 
{a:8, b:15, c:7} 
{a:4, b:7} 
{a:3, b:10} 

Giả sử rằng chúng ta muốn tạo một chỉ mục trên các tài liệu trên. Tạo chỉ mục trên a & b sẽ không có vấn đề gì. Nhưng nếu chúng ta cần tạo chỉ mục trên c. Ràng buộc duy nhất sẽ không hoạt động đối với các khóa cgiá trị rỗng được nhân đôi cho 2 tài liệu. Giải pháp trong trường hợp này là sử dụng tùy chọn sparse. Tùy chọn này yêu cầu cơ sở dữ liệu không bao gồm các tài liệu bị mất khóa. Lệnh liên quan là db.collectionName.createIndex({thing:1}, {unique:true, sparse:true}). Chỉ số thưa thớt cho phép chúng tôi sử dụng ít không gian hơn.

Lưu ý rằng ngay cả khi chúng tôi có chỉ mục sparse, cơ sở dữ liệu thực hiện tất cả các tài liệu quét đặc biệt khi thực hiện sắp xếp. Điều này có thể được nhìn thấy trong kế hoạch chiến thắng của kết quả explain.