مشاركة عبر


$geoNear

تحسب $geoNear مرحلة التجميع المسافات بين نقطة محددة وحقل الموقع في كل مستند، وتفرز المستندات حسب المسافة، ويمكنها اختياريا تحديد النتائج حسب المسافة.

إعراب

{
  $geoNear: {
    near: {
      type: "Point",
      coordinates: [<longitude>, <latitude>]
    },
    distanceField: <field to store distance>,
    maxDistance: <optional maximum distance in meters>,
    minDistance: <optional minimum distance in meters>,
    query: <optional query conditions>,
    includeLocs: <optional boolean to include locations>,
    distanceMultiplier: <optional distance multiplier>,
    spherical: <boolean, must be true>,
    key: <optional field path>
  }
}

Parameters

المعلمة‬ Type Description
near Object النقطة التي يمكن من خلالها حساب المسافات
distanceField سلسلة الحقل الذي يحتوي على مسافة حوسبة
maxDistance رقم اختياري. أقصى مسافة بالعدادات من نقطة
minDistance رقم اختياري. الحد الأدنى للمسافة بالعدادات من نقطة
query مستند شروط الاستعلام الاختيارية
includeLocs منطقي اختياري. تضمين المواقع في النتائج
distanceMultiplier رقم اختياري. ضرب المسافات بهذه القيمة
spherical منطقي يجب أن يكون صحيحا لمؤشرات 2dsphere
key سلسلة اختياري. مسار الحقل لاستخدامه لحساب المسافات

أمثلة

ضع في اعتبارك نموذج المستند هذا من مجموعة المتاجر.

{
  "_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
  "name": "First Up Consultants | Bed and Bath Center - South Amir",
  "location": {
    "lat": 60.7954,
    "lon": -142.0012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 18,
      "partTime": 17
    }
  },
  "sales": {
    "totalSales": 37701,
    "salesByCategory": [
      {
        "categoryName": "Mattress Toppers",
        "totalSales": 37701
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Price Drop Palooza",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 21
        },
        "endDate": {
          "Year": 2024,
          "Month": 9,
          "Day": 30
        }
      },
      "discounts": [
        {
          "categoryName": "Bath Accessories",
          "discountPercentage": 18
        },
        {
          "categoryName": "Pillow Top Mattresses",
          "discountPercentage": 17
        }
      ]
    }
  ]
}

مثال 1: حساب المسافة الأساسية

يسترد هذا الاستعلام جميع المتاجر بالقرب من موقع "VanArsdel Picture Frame Store"، الذي تم فرزه حسب المسافة:

db.stores.aggregate([
  {
    $geoNear: {
      near: {
        type: "Point",
        coordinates: [-141.9922, 16.8331]  // VanArsdel Picture Frame Store location
      },
      distanceField: "distance",
      spherical: true
    }
  },
  {
    $project: {
      name: 1,
      distance: 1
    }
  }
])

النتائج الثلاث الأولى التي تم إرجاعها بواسطة هذا الاستعلام هي:

[
    {
        "_id": "643b2756-c22d-4063-9777-0945b9926346",
        "name": "Contoso, Ltd. | Outdoor Furniture Corner - Pagacfort",
        "distance": 5458613.2813355485
    },
    {
        "_id": "daa71e60-75d4-4e03-8b45-9df59af0811f",
        "name": "First Up Consultants | Handbag Corner - South Salvatore",
        "distance": 5469362.958855379
    },
    {
        "_id": "02a78a15-b1fc-4bbd-ae1d-641b7428dc78",
        "name": "VanArsdel, Ltd. | Kitchen Appliance Corner - Llewellynberg",
        "distance": 5472684.4628977
    }
]

مثال 2: مع حدود المسافة والاستعلام الاختياري

يسترد هذا الاستعلام جميع المتاجر ضمن 30 كم من "Proseware Home Entertainment Hub" التي تحتوي على أكثر من 10 موظفين بدوام كامل:

db.stores.aggregate([
  {
    $geoNear: {
      near: {
        type: "Point",
        coordinates: [69.7296, 70.1272]  // "Proseware Home Entertainment Hub" location
      },
      distanceField: "distance",
      maxDistance: 30000,  // 30 kilometers in meters
      query: { "staff.totalStaff.fullTime": { $gt: 10 } },
      spherical: true
    }
  },
  {
    $project: {
      name: 1,
      distance: 1,
      "staff.totalStaff.fullTime": 1
    }
  }
])

النتيجة الأولى التي تم إرجاعها بواسطة هذا الاستعلام هي:

[
    {
        "_id": "bbec6d3e-1666-45b4-8803-8b7ef8544845",
        "name": "First Up Consultants | Baby Products Bargains - South Keenan",
        "staff": {
            "totalStaff": {
                "fullTime": 19
            }
        },
        "distance": 29934.71888123174
    }
]

مثال 3: بما في ذلك بيانات الموقع ومضاعف المسافة

يسترد هذا الاستعلام المخازن ذات المسافة بالكيلومترات وبيانات الموقع المضمنة:

db.stores.aggregate([
  {
    $geoNear: {
      near: {
        type: "Point",
        coordinates: [-38.4071, -47.2548]  // "Fabrikam Car Accessory Outlet" location
      },
      distanceField: "distanceInKm",
      includeLocs: "storeLocation",
      distanceMultiplier: 0.001,  // Convert meters to kilometers
      spherical: true
    }
  },
  {
    $project: {
      name: 1,
      distanceInKm: 1,
      storeLocation: 1
    }
  }
])

النتائج الثلاث الأولى التي تم إرجاعها بواسطة هذا الاستعلام هي:

[
    {
        "_id": "b677846e-bb73-46ec-9cba-7d94afee382c",
        "name": "Northwind Traders | Health Food Shoppe - Brooklynmouth",
        "storeLocation": {
            "lat": -38.3032,
            "lon": -132.7866
        },
        "distanceInKm": 9.095634270192285
    },
    {
        "_id": "27c64b44-2382-4477-b3ce-c08e74882156",
        "name": "Relecloud | VR Headset Gallery - West Jonasbury",
        "storeLocation": {
            "lat": -37.9628,
            "lon": -132.6637
        },
        "distanceInKm": 34.7104536140246
    },
    {
        "_id": "505e83eb-09bc-46a4-ba85-16135611b9de",
        "name": "Fabrikam, Inc. | Pharmacy Hub - Elijahville",
        "storeLocation": {
            "lat": -38.0349,
            "lon": -47.9571
        },
        "distanceInKm": 82.92766541748313
    }
]

القيود

  • لا يمكن استخدامه مع المجموعات المقسمة
  • مرحلة $geoNear واحدة فقط لكل مسار
  • يجب أن تكون المرحلة الأولى في البنية الأساسية لبرنامج ربط العمليات التجارية