MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

मोंगोडब के साथ $ बॉक्स के साथ दस्तावेज़ प्राप्त करें और विशिष्ट समन्वय बिंदु के साथ प्रत्येक रिकॉर्ड के लिए दूरी फ़ील्ड जोड़ें

यह काम करना चाहिए:

db.collection.aggregate([
   {
      "$match": {
         "location": {
            "$geoWithin": {
               "$box": [
                  [0.024719919885622943, 51.54643953472475],
                  [-0.1589577534542408, 51.47239969138267]
               ]
            }
         }
      }
   },
   { $set: { lon: -0.0649729793707321 } },
   { $set: { lat: 51.50160291888072 } },
   {
      $set: {
         distance: {
            $let: {
               vars: {
                  dlon: { $degreesToRadians: { $subtract: [{ $arrayElemAt: ["$location.coordinates", 0] }, "$lon"] } },
                  dlat: { $degreesToRadians: { $subtract: [{ $arrayElemAt: ["$location.coordinates", 1] }, "$lat"] } },
                  lat1: { $degreesToRadians: { $arrayElemAt: ["$location.coordinates", 1] } },
                  lat2: { $degreesToRadians: "$lat" }
               },
               in: {
                  // Haversine formula: sin²(dLat / 2) + sin²(dLon / 2) * cos(lat1) * cos(lat2);
                  $add: [
                     { $pow: [{ $sin: { $divide: ["$$dlat", 2] } }, 2] },
                     { $multiply: [{ $pow: [{ $sin: { $divide: ["$$dlon", 2] } }, 2] }, { $cos: "$$lat1" }, { $cos: "$$lat2" }] }
                  ]
               }
            }
         }
      }
   },
   {
      $set: {
         distance: {
            // Distance in Meters given by "6372.8 * 1000"
            $multiply: [6372.8, 1000, 2, { $asin: { $sqrt: "$distance" } }]
         }
      }
   },
])

बस एक नोट, $box केवल विरासत निर्देशांक जोड़े के लिए उपयोग किया जाता है . उचित क्वेरी के लिए (अर्थात 2dsphere . का उचित उपयोग index) आपको $geometry . का उपयोग करना चाहिए :

db.collection.createIndex({ location: "2dsphere" })
db.collection.find(
   {
      "location": {
         "$geoWithin": {
            "$geometry": {
               type: "Polygon",
               coordinates: [[
                  [-0.1589577534542408, 51.47239969138267],
                  [-0.1589577534542408, 51.54643953472475],
                  [0.024719919885622943, 51.54643953472475],
                  [0.024719919885622943, 51.47239969138267],
                  [-0.1589577534542408, 51.47239969138267]
               ]]
            }
         }
      }
   }
).explain().queryPlanner.winningPlan.inputStage.indexName

--> location_2dsphere // which means index is used


db.collection.find(
   {
      "location": {
         "$geoWithin": {
            "$box": [
               [0.024719919885622943, 51.54643953472475],
               [-0.1589577534542408, 51.47239969138267]
            ]
         }
      }
   }
).explain().queryPlanner.winningPlan.stage

--> COLLSCAN // which means full collection scan

या लीगेसी निर्देशांकों का उचित उपयोग:

db.collection.createIndex({ "location.coordinates": "2d" })
db.collection.find(
   {
      "location.coordinates": { // <- note this difference
         "$geoWithin": {
            "$box": [
               [0.024719919885622943, 51.54643953472475],
               [-0.1589577534542408, 51.47239969138267]
            ]
         }
      }
   }
).explain().queryPlanner.winningPlan.inputStage.indexName

--> location.coordinates_2d



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जावा में मोंगोडब $ समूह का उपयोग कैसे करें?

  2. MongoDB प्रदर्शन ट्रैक करें?

  3. MongoDB नेस्टेड दस्तावेज़ खोज रहे हैं

  4. मोंगोडब में एक संग्रह का अद्यतन स्तंभ

  5. yii2 mongodb के साथ लॉगिन या साइनअप के लिए काम नहीं कर रहा है