استخدام البحث الجغرافي المكاني

استخدِم طلبات البحث الجغرافية المكانية في العمليات المتوافقة مع MongoDB للبحث عن المستندات التي تقع ضمن نطاق معيّن من خطوط الطول والعرض المحدّدة.

قبل البدء

  1. تأكَّد من إمكانية الوصول إلى قاعدة بيانات حالية متوافقة مع عمليات MongoDB، أو أنشئ قاعدة بيانات واتّصِل بها.

  2. تأكَّد من توفّر فهرس 2dsphere واحد على الأقل، أو أنشئ فهرس 2dsphere.

عناصر GeoJSON

لتنفيذ طلب بحث جغرافي مكاني على الحقول في مجموعتك، يجب أن تكون الحقول التي تبحث فيها عناصر GeoJSON أو GeoPoints.

يمكنك تنفيذ طلب بحث جغرافي مكاني باستخدام عامل التشغيل $near، الذي يحسب المسافة بين نقطة جغرافية ونقاط جغرافية أخرى ضمن المستندات. بعد ذلك، يتم ترتيب هذه المستندات من الأقرب إلى الأبعد في نتائج طلب البحث. يمكنك أيضًا إلغاء ترتيب الفرز هذا من خلال تحديد فرز ثانوي، بخلاف $natural، في طلب البحث. يجب أن يكون عامل التشغيل $near متوفّرًا في حقل مستند ضمن فلتر طلب البحث، ويجب أن يحتوي على حقل $geometry GeoJSON.

في المثال التالي، يتم استخدام عامل التشغيل $near لحساب المسافة بين النقطة الجغرافية (-122.084, 37.4221) والنقاط الجغرافية الموجودة في الحقل location لجميع المستندات في myCollection.. يتم عرض المستندات وترتيبها حسب المسافة الأقرب إلى الأبعد بين النقطتين.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

يمكنك أيضًا استخدام الحقلَين الاختياريَين $maxDistance و$minDistance للتحكّم في المسافة بالأمتار من نقطة طلب البحث. يعرض المثال التالي طلب بحث يجب أن تكون فيه المستندات التي يتم إرجاعها على بُعد 500 متر على الأقل و2000 متر على الأكثر من النقطة (-122.084, 37.4221):

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

إذا كان الفهرس مقسَّمًا، يمكنك الفلترة استنادًا إلى القسم من خلال تضمين القسم في فلتر المساواة "و" ضمن طلب البحث. على سبيل المثال، إذا كان لديك قسم region وأردت فلترة نتائج طلب البحث حسب المنطقة midwest، يمكنك إجراء ما يلي:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

يجب أن تكون قيمة القسم سلسلة. يجب ربط فلتر التقسيم بطلب البحث باستخدام عامل التشغيل $and.

القيود

  • لا يمكن استخدام عاملي التشغيل $near و$text في طلب البحث نفسه.
  • لا يمكن تضمين $near في عبارة $or متعددة العبارات إلا إذا كانت $near هي التعبير الوحيد في عبارة $or.
  • لا يمكن استخدام $near مع عاملَي التشغيل $not أو $nor في طلب بحث واحد.
  • لا يتوافق $near مع طلبات البحث المجمّعة.