يمكنك استخدام طلبات البحث الجيوفضائية في العمليات المتوافقة مع MongoDB للاستعلام عن المستندات التي تقع ضمن نطاق معيّن من خط طول وعرض محدّدين.
قبل البدء
تأكَّد من إمكانية الوصول إلى قاعدة بيانات حالية للعمليات المتوافقة مع MongoDB أو أنشئ قاعدة بيانات واتصل بها.
تأكَّد من توفّر فهرس 2dsphere واحد على الأقل أو أنشئ فهرس 2dsphere.
عناصر GeoJSON
لتنفيذ طلب بحث جيوفضائي مقابل الحقول في مجموعتك، يجب أن تكون الحقول التي تستعلم عنها عناصر GeoJSON أو GeoPoints.
تنفيذ طلب بحث جيوفضائي
يمكنك تنفيذ طلب بحث جيوفضائي باستخدام عامل التشغيل $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
}
}
}
إذا كان الفهرس مقسَّمًا، يمكنك الفلترة استنادًا إلى القسم من خلال تضمين القسم في فلتر المساواة "و" ضمن طلب البحث.
على سبيل المثال، إذا كان لديك قسم 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مع طلبات بحث التجميع.