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

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

قبل البدء

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

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

كائنات GeoJSON

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

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

في المثال التالي، يتم استخدام عامل التشغيل $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
      }
    }
  }

إذا كان الفهرس مقسّمًا، يمكنك الفلترة استنادًا إلى القسم من خلال تضمين القسم في فلتر مساواة "and" ضمن طلب البحث. على سبيل المثال، إذا كان لديك قسم 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 في طلبات البحث المجمّعة.