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

يمكنك استخدام طلبات البحث الجيوفضائية في العمليات المتوافقة مع 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 مع طلبات بحث التجميع.