استفاده از جستجوی مکانی

از پرس‌وجوهای مکانی در عملیات سازگار با 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
      }
    }
  }

اگر اندیس شما پارتیشن‌بندی شده باشد، می‌توانید با قرار دادن پارتیشن در یک فیلتر تساوی "و" در پرس‌وجوی خود، آن را بر اساس پارتیشن فیلتر کنید. برای مثال، اگر یک پارتیشن 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 در پرس‌وجوهای تجمیعی پشتیبانی نمی‌شود.