MongoDB cung cấp các loại chỉ mục không gian địa lý sau để hỗ trợ các truy vấn không gian địa lý.
- Chỉ mục 2d hỗ trợ các truy vấn tính toán hình học trên mặt phẳng hai chiều.
-
2dsphere
chỉ mục hỗ trợ các truy vấn tính toán hình học trên một hình cầu giống trái đất.
Trong bài viết này, tôi tạo 2dsphere
chỉ mục.
Bộ sưu tập mẫu
Giả sử chúng ta có một bộ sưu tập được gọi là bars
với các tài liệu sau:
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ 145.77675259719823, -16.919297718553366 ] } } { "_id" : 2, "name" : "The Downunder Bar", "location" : { "type" : "Point", "coordinates" : [ 145.77621640842125, -16.92107838010542 ] } } { "_id" : 3, "name" : "Riley", "location" : { "type" : "Point", "coordinates" : [ 145.7739955395154, -16.916028253292883 ] } } { "_id" : 4, "name" : "Salt House", "location" : { "type" : "Point", "coordinates" : [ 145.78148426655065, -16.91823513430776 ] } } { "_id" : 5, "name" : "Rattle n Hum", "location" : { "type" : "Point", "coordinates" : [ 145.77746095331537, -16.920051942529685 ] } }
Mỗi tài liệu có thông tin vị trí được lưu trữ dưới dạng đối tượng GeoJSON.
Một đối tượng GeoJSON có một trường có tên là type
chỉ định kiểu đối tượng GeoJSON và trường có tên là coordinates
xác định tọa độ của đối tượng.
Tạo Chỉ mục 2dsphere
Bây giờ chúng ta hãy tạo 2dsphere
chỉ mục.
db.bars.createIndex( { location : "2dsphere" } )
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
2dsphere
chỉ mục hiện đã được tạo.
Bây giờ chúng ta có thể sử dụng getIndexes()
phương pháp để kiểm tra chỉ mục của chúng tôi:
db.bars.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
Chúng ta có thể thấy rằng chỉ mục được tạo dưới dạng 2dsphere
lập chỉ mục, sử dụng 2dsphereIndexVersion
trong tổng số 3
, là phiên bản mặc định cho cài đặt MongoDB hiện tại của tôi (4.4).
Tạo chỉ mục 2dsphere tổng hợp
Bạn có thể bao gồm 2dsphere
các khóa chỉ mục trong chỉ mục ghép được kết hợp với các khóa chỉ mục không theo không gian địa lý.
Ví dụ:chúng tôi có thể đã kết hợp location
trường với name
trường để tạo chỉ mục kết hợp.
Hãy bỏ chỉ mục và tạo chỉ mục kết hợp:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Và kiểm tra chỉ mục:
db.bars.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
Hợp chất 2dsphere
các chỉ mục có thể tham chiếu đến nhiều trường vị trí và không phải vị trí. Điều này trái ngược với kết hợp 2d
chỉ mục, được giới hạn trong việc chỉ tham chiếu đến một trường vị trí và một trường khác.
Thay đổi 2dsphereIndexVersion
Bạn có thể thay đổi 2dsphereIndexVersion
bằng cách thêm nó dưới dạng một trường có giá trị mong muốn khi tạo chỉ mục.
Ví dụ:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Kiểm tra chỉ mục:
db.bars.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
Chỉ mục này đã được tạo dưới dạng 2dsphere
phiên bản chỉ mục 2.
Phiên bản 2 là phiên bản mặc định của 2dsphere
các chỉ mục được tạo trong chuỗi MongoDB 2.6 và 3.0.
Phiên bản 3 là phiên bản mặc định của 2dsphere
các chỉ mục được tạo trong MongoDB 3.2 trở lên (tại thời điểm viết bài).
Khi tôi tạo chỉ mục mà không chỉ định 2dsphereIndexVersion
, nó đã tạo chỉ mục bằng cách sử dụng phiên bản 3, vì đó là phiên bản mặc định cho phiên bản MongoDB của tôi (4.4).