Nếu bạn gặp phải lỗi "kinh độ / vĩ độ nằm ngoài giới hạn" khi cố gắng tạo chỉ mục 2dsphere trong MongoDB, thì có thể do tọa độ kinh độ và vĩ độ của bạn không đúng thứ tự.
Khi bạn tạo một đối tượng GeoJSON, bạn cần liệt kê kinh độ trước rồi đến vĩ độ.
- Các giá trị kinh độ hợp lệ nằm trong khoảng
-180
và180
, bao gồm cả hai. - Các giá trị vĩ độ hợp lệ nằm trong khoảng
-90
và90
, bao gồm cả hai.
Do đó, nếu bạn gặp phải lỗi "kinh độ / vĩ độ nằm ngoài giới hạn", hãy kiểm tra tài liệu của bạn để xem vĩ độ và kinh độ nằm ở thứ tự nào.
Ví dụ về Lỗi
Dưới đây là ví dụ về tập hợp có tên là bars
chứa các tài liệu có tọa độ không đúng thứ tự.
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ -16.919297718553366, 145.77675259719823 ] } } { "_id" : 2, "name" : "The Downunder Bar", "location" : { "type" : "Point", "coordinates" : [ -16.92107838010542, 145.77621640842125 ] } }
Nếu chúng tôi cố gắng tạo chỉ mục 2dsphere trên location
, chúng tôi sẽ gặp lỗi.
Ví dụ:
db.bars.createIndex(
{ location : "2dsphere" }
)
Kết quả:
{ "ok" : 0, "errmsg" : "Index build failed: 2bb26869-1dec-4484-b554-3ba55fc0c0de: Collection krankykranes.bars ( e1a99ee2-b77c-41a4-b833-25c4b3c599c3 ) :: caused by :: Can't extract geo keys: { _id: 1.0, name: \"Boardwalk Social\", location: { type: \"Point\", coordinates: [ -16.91929771855337, 145.7767525971982 ] } } longitude/latitude is out of bounds, lng: -16.9193 lat: 145.777", "code" : 16755, "codeName" : "Location16755" }
Ví dụ với Thứ tự Tọa độ Chính xác
Đây là bộ sưu tập một lần nữa, ngoại trừ các tọa độ theo đúng thứ tự:
{ "_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 ] } }
Bây giờ, hãy tạo chỉ mục 2dsphere trên location
lĩnh vực:
db.bars.createIndex(
{ location : "2dsphere" }
)
Kết quả:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Điều này có nghĩa là nó đã được tạo ra.
Chúng tôi có thể kiểm tra điều này bằng getIndexes()
phương pháp:
db.bars.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]