אפשר להשתמש בשאילתות גיאו-מרחביות בפעולות שתואמות ל-MongoDB כדי לשלוח שאילתות למסמכים שקיימים בטווח מסוים מקו אורך וקו רוחב ספציפיים.
לפני שמתחילים
מוודאים שיש לכם גישה למסד נתונים קיים של פעולות שתואם ל-MongoDB, או יוצרים מסד נתונים ומתחברים אליו.
מוודאים שיש לכם לפחות אינדקס 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 כדי לשלוט במרחק במטרים מהנקודה של השאילתה.
בדוגמה הבאה מוצגת שאילתה שבה המסמכים שמוחזרים חייבים להיות במרחק של לפחות 500 מטרים ולכל היותר 2,000 מטרים מהנקודה (-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בשאילתות צבירה.