این فصل با معرفی نحوه‌ی ذخیره داده‌های مکانی MongoDB شروع می‌شود. برای استفاده از قابلیت جستجوی مکانی MongoDB، ابتدا باید بفهمیم که چگونه داده‌های مکانی را ذخیره کنیم.

داده‌های مکانی اصلی از نقاط، خطوط و اشکال هندسی تشکیل می‌شود.

یک نقطه روی نقشه توسط مختصات طول و عرض خود تعریف می‌شود. چند نقطه می‌توانند یک خط را شکل دهند و چند خط می‌توانند اشکال مختلفی را شکل دهند.

در برنامه‌های عملی: موقعیت یک فروشگاه، "کجا هستم؟" و "مدرسه کجاست؟" همگی می‌توانند با استفاده از مختصات نشان داده شوند. توصیف محدوده‌ی یک دانشگاه یا یک مرکز خرید نیازمند اشکال هندسی است.

شیء GeoJSON

MongoDB از اشیاء GeoJSON برای نمایش اطلاعات مکانی استفاده می‌کند.

انواع مشترک GeoJSON عبارتند از:

  • نقطه - نمایش یک نقطه مختصاتی
  • LineString - نمایش یک خط
  • Polygon - نمایش یک چندضلعی

فرمت ذخیره‌سازی اشیاء GeoJSON در فیلدهای MongoDB به صورت زیر است:

<field>: { type: <geojson type> , coordinates: <coordinates> }

توضیحات:

  • - نام فیلد
  • type - نوع GeoJSON
  • coordinates - یک آرایه از نقاط مختصات. فرمت برای انواع مختلف GeoJSON متفاوت است.

مثال:

location: {
      type: "Point",  // نوع داده مکانی، در این مورد یک نقطه مختصاتی است
      coordinates: [-73.856077, 40.848447] // طول و عرض
}

توضیحات: فیلد موقعیت اطلاعات مکانی از نوع نقطه مختصاتی را ذخیره می‌کند.

نقطه مختصاتی (Point)

فرمت:

{ type: "Point", coordinates: [ طول, عرض ] }

مثال:

{ type: "Point", coordinates: [ 40, 5 ] }

خط (LineString)

فرمت:

{ type: "LineString", coordinates: [ نقطه1, نقطه2, ...] }

مثال:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

چندضلعی

می‌تواند از یک یا چند خط تشکیل شود. فرمت:

{
  type: "Polygon",
  coordinates: [ 
		خط1,
		خط2,
		....
	]
}

توجه: مختصات آغازین و پایانی هر بخش خط باید یکسان باشند تا یک شکل بسته را شکل دهند.

شکل تشکیل شده از یک بخش خط تک‌قطعه‌ای

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // نقاط مختصاتی بخش خط، توجه کنید که مختصات ابتدا و انتهایی یکسان هستند.
	]
}

شکل تشکیل شده از چند بخش خط

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // بخش خط 1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // بخش خط 2
  ]
}

فهرست مکانی

MongoDB دو نوع فهرست مکانی را پشتیبانی می‌کند تا جستجوی داده‌های GeoJSON را تسریع کند.

2dsphere

این یک نوع فهرست هندسه کره‌ای است، یعنی وقتی مسافت بین دو نقطه محاسبه می‌شود، 2dsphere زمین را به عنوان یک کره در نظر می‌گیرد.

مثال ایجاد یک فهرست 2dsphere:

db.collection.createIndex( { location : "2dsphere" } )

یک فهرست برای فیلد موقعیت ایجاد می‌کند.

2d

2D یک نوع هندسه مسطح است که برای محاسبه مسافت بین دو نقطه به صورتی استفاده می‌شود که به نظر می‌رسد و گویی آن‌ها در یک صفحه باشند. مثال ایجاد یک فهرست 2D:

db.collection.createIndex( { location : "2d" } )

این یک فهرست برای فیلد موقعیت ایجاد می‌کند.

انواع جستجوی مکانی

جستجوهای مکانی همگی مربوط به محاسبات هندسی هستند. در زیر انواع جستجوی پشتیبانی شده توسط MongoDB آمده است:

  • $geoIntersects - برای مطابقت با اسناد با تقاطع شکل هندسی خاص استفاده می‌شود.
  • $geoWithin - اسنادی که درون محدوده‌ی هندسی مشخص شده هستند را مطابقت می‌دهد.
  • $near - معمولاً برای پرس و جو اسناد نزدیک‌تر به یک نقطه مخصوص استفاده می‌شود.

توجه: برای اطلاعات بیشتر در مورد جستجوهای مکانی، لطفاً به فصول بعدی مراجعه کنید.