استفاده از پُرسمان‌های زمین‌مکانی

از پُرسمان‌های زمین‌مکانی در عملیات سازگار با MongoDB برای پُرسمان اسنادی که در محدوده خاصی از طول و عرض جغرافیایی مشخصی وجود دارند استفاده کنید.

قبل از شروع

  1. مطمئن شوید که به پایگاه داده عملیات سازگار با MongoDB موجود دسترسی دارید، یا پایگاه داده‌ای ایجاد کنید و به آن متصل شوید.

  2. مطمئن شوید حداقل یک نمایه 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 برای کنترل فاصله برحسب متر از نقطه پُرسمانتان استفاده کنید. مثال زیر پُرسمانی را نشان می‌دهد که در آن اسناد برگردانده‌شده باید حداقل ۵۰۰ متر و حداکثر ۲۰۰۰ متر از نقطه (-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 در پُرسمان‌های انبوهشی پشتیبانی نمی‌شود.