"निकट" के लिए मामला
मानी गई दूरी हमेशा संग्रहीत किसी भी GeoJSON ऑब्जेक्ट के "निकटतम" बिंदु से होगी। पॉलीगॉन, या मल्टीपॉलीगॉन और वास्तव में सभी जियोसन ऑब्जेक्ट्स के लिए वही जाता है जो भंडारण के लिए मान्य हैं।
इस पर विचार करें:
{
"location": {
"type": "MultiPoint",
"coordinates": [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
}
और अगर हम एग्रीगेशन का उपयोग करते हैं $geoNear
हमें किसी दिए गए स्थान से दूरी दिखाने के साधन के रूप में:
db.geo.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.97661209106445,
40.774561857347244
]
},
"spherical": true,
"distanceField": "distance"
}}
])
यह हमें बताता है कि दूरी 824 मीटर मानी जाती है।
अब यदि आप संग्रह के बजाय प्रत्येक "बिंदु" को अपना दस्तावेज़ मानते हैं, और उसी क्वेरी प्रक्रिया को चलाते हैं:
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
},
"distance" : 824.837276194968
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
},
"distance" : 1114.0666715946495
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.958,
40.8003
]
},
"distance" : 3266.4720692258156
}
{
"location" : {
"type" : "Point",
"coordinates" : [
-73.9498,
40.7968
]
},
"distance" : 3351.9091229713567
}
फिर आप देखते हैं कि मूल बिंदु से प्रत्येक बिंदु की अलग-अलग दूरी क्वेरी है, जहां पूर्व मामले में केवल "निकटतम" वास्तव में पूरी वस्तु के लिए माना जाता था।
तो इस बात का प्रमाण है, कि $near
. के साथ मानी जाने वाली दूरी /$geoNear
या हमेशा केवल . होता है क्वेरी में प्रयुक्त मूल के निकटतम बिंदु।
$geoWithin के लिए मामला
$geoWithin
हालांकि ऑपरेशन अलग है। मूल "मल्टीपॉइंट" दस्तावेज़ और फिर इस प्रश्न पर विचार करें:
db.geo.find({
"location": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [
[
[
-73.98382186889648,
40.75961056635002
],
[
-74.00030136108398,
40.782751138401245
],
[
-73.97317886352539,
40.78950978441435
],
[
-73.95910263061523,
40.7720918760227
],
[
-73.98382186889648,
40.75961056635002
]
]
]
}
}
}
})
यह कोई परिणाम नहीं लौटाएगा, और ऐसा इसलिए नहीं होगा क्योंकि ऑब्जेक्ट के "सभी नहीं" बिंदु घटक क्वेरी में उपयोग किए गए tge बहुभुज की सीमा के भीतर हैं। लेकिन अगर आप प्रत्येक बिंदु को एक दस्तावेज़ के रूप में मानते हैं:
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef8"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9737,
40.7648
]
}
}
{
"_id" : ObjectId("564d5efd9f28c6e0feabcef9"),
"location" : {
"type" : "Point",
"coordinates" : [
-73.9814,
40.7681
]
}
}
तब दो बिंदु बहुभुज के अंदर दिखाई देंगे। लेकिन चूंकि ये व्यक्तिगत दस्तावेज़ों के रूप में नहीं बल्कि "MutiPoint" के हिस्से के रूप में संग्रहीत किए जाते हैं, तब तक जब तक सभी उस वस्तु के हिस्से आकार के भीतर समाहित हैं, तो परिणाम गलत है और दस्तावेज़ वापस नहीं किया जाता है।
यहां सभी जियोसन ऑब्जेक्ट्स के लिए भी यही सच है जिसमें अनिवार्य रूप से कुछ प्रतिनिधित्व में "प्वाइंट" का संग्रह होता है।