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

Tạo Chỉ mục không gian địa lý 2dsphere cho các truy vấn hình cầu trong MongoDB

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).


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Không thể giải mã hóa PyMongo ObjectId từ JSON

  2. Kết nối laravel jenssegers với cụm tập bản đồ mongodb

  3. Giao dịch trong MongoDB

  4. Đồng tiền trong gopkg.in/mgo.v2 (Mongo, Go)

  5. Tài liệu về các lời hứa của Mongoose cho biết các truy vấn không phải là lời hứa?