Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der $geometry Operator gibt ein GeoJSON-Geometrieobjekt für Geospatialabfragen an. Es wird in anderen geospatialen Operatoren verwendet, um Shapes und Punkte für räumliche Berechnungen zu definieren.
Syntax
{
$geometry: {
type: <GeoJSON type>,
coordinates: <coordinates>
}
}
Die Parameter
| Parameter | Description |
|---|---|
type |
GeoJSON-Objekttyp (Point, Polygon, MultiPolygon usw.) |
coordinates |
Koordinaten, die das GeoJSON-Objekt als Array definieren |
Examples
Lassen Sie uns die Verwendung anhand der JSON-Beispieldatei aus stores-Dataset verstehen.
{
"_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
"name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
"location": {
"lat": -89.2384,
"lon": -46.4012
},
"staff": {
"totalStaff": {
"fullTime": 8,
"partTime": 20
}
},
"sales": {
"totalSales": 75670,
"salesByCategory": [
{
"categoryName": "Wine Accessories",
"totalSales": 34440
},
{
"categoryName": "Bitters",
"totalSales": 39496
},
{
"categoryName": "Rum",
"totalSales": 1734
}
]
},
"promotionEvents": [
{
"eventName": "Unbeatable Bargain Bash",
"promotionalDates": {
"startDate": {
"Year": 2024,
"Month": 6,
"Day": 23
},
"endDate": {
"Year": 2024,
"Month": 7,
"Day": 2
}
},
"discounts": [
{
"categoryName": "Whiskey",
"discountPercentage": 7
},
{
"categoryName": "Bitters",
"discountPercentage": 15
},
{
"categoryName": "Brandy",
"discountPercentage": 8
},
{
"categoryName": "Sports Drinks",
"discountPercentage": 22
},
{
"categoryName": "Vodka",
"discountPercentage": 19
}
]
},
{
"eventName": "Steal of a Deal Days",
"promotionalDates": {
"startDate": {
"Year": 2024,
"Month": 9,
"Day": 21
},
"endDate": {
"Year": 2024,
"Month": 9,
"Day": 29
}
},
"discounts": [
{
"categoryName": "Organic Wine",
"discountPercentage": 19
},
{
"categoryName": "White Wine",
"discountPercentage": 20
},
{
"categoryName": "Sparkling Wine",
"discountPercentage": 19
},
{
"categoryName": "Whiskey",
"discountPercentage": 17
},
{
"categoryName": "Vodka",
"discountPercentage": 23
}
]
}
]
}
Beispiel 1: Suchen der nächstgelegenen Speicher zur Punktgeometrie
Um eine bessere Leistung zu erzielen, beginnen Sie mit dem Erstellen des erforderlichen 2dsphere Indexes.
db.stores.createIndex({ location: "2dsphere" })
Die Abfrage ruft bis zu zwei Speicher ab, die dem Punkt an Koordinaten am nächsten liegen [46.2917, -62.6354], sortiert nach Näherung. Es verwendet den $near-Operator, um Ergebnisse nach Entfernung von einem bestimmten Punkt zu sortieren und dabei zu helfen, Geschäfte zu finden, die geografisch am nächsten an einem bestimmten Ort sind.
db.stores.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [46.2917, -62.6354]
}
}
}
}, {
name: 1,
location: 1
}).limit(2)
Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden, sind:
[
{
"_id": "59c355e9-586c-44f8-bbaf-a87989142119",
"name": "Relecloud | Outdoor Furniture Shop - Chetside",
"location": { "lat": 46.188, "lon": -62.2789 }
},
{
"_id": "d3a9cc23-e6ae-4806-93ac-1ade2f624742",
"name": "VanArsdel, Ltd. | Furniture Place - North Dustinside",
"location": { "lat": 47.3426, "lon": -62.4031 }
}
]
Beispiel 2: Suchen der nächstgelegenen Speicher zur Polygongeometrie
Diese Abfrage findet bis zu zwei Geschäfte, deren Standorte sich mit einem definierten rechteckigen Polygon schneiden, das durch Koordinaten von [-80.0, -75.0] bis [-55.0, -70.0] begrenzt ist.
Der $geoIntersects Operator findet Geschäfte, die deine Polygongrenzen überlappen oder berühren – optimal, um zu identifizieren, welche Standorte mit einer bestimmten geografischen Zone interagieren, unabhängig davon, ob sie vollständig darin sind oder den Rand nur überschreiten.
db.stores.find({
location: {
$geoIntersects: {
$geometry: {
type: "Polygon",
coordinates: [[
[-80.0, -75.0], // Bottom-left
[-80.0, -70.0], // Top-left
[-55.0, -70.0], // Top-right
[-55.0, -75.0], // Bottom-right
[-80.0, -75.0] // Close polygon
]]
}
}
}
}, {
name: 1,
location: 1,
city: 1
}).limit(2)
Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden.
[
{
"_id": "6bba7117-d180-4584-b50c-a2f843e9c9ab",
"name": "Wide World Importers | Craft Supply Mart - Heaneybury",
"location": { "lat": -64.4843, "lon": -107.7003 },
"city": "Heaneybury"
},
{
"_id": "2fd37663-e0ff-41d0-9c5a-3aec86285daa",
"name": "Relecloud | Cleaning Supply Closet - Patiencehaven",
"location": { "lat": -70.6077, "lon": -105.9901 },
"city": "Patiencehaven"
}
]
Beispiel 3: Suchen der nächstgelegenen Speicher für die Geometrie mit mehreren Polygonen
Das Beispiel ruft bis zu zwei Speicher ab, deren Speicherorte in einem der beiden definierten rechteckigen Bereiche (MultiPolygon) liegen: eine in der Nähe der Koordinaten [120,0, -13.0] bis [125.0, -10,0] und eine weitere in der Nähe von [44.0, -64.0] bis [48.0, -61.0].
Es verwendet den $geoWithin-Operator mit einer MultiPolygon-Geometrie, um nach Speichern zu suchen, die von einem der angegebenen Polygone eingeschlossen sind, sodass es für die Gleichzeitige Abfrage über mehrere nicht angrenzende geografische Gebiete nützlich ist.
db.stores.find({
location: {
$geoWithin: {
$geometry: {
type: "MultiPolygon",
coordinates: [
[[
[120.0, -13.0],
[120.0, -10.0],
[125.0, -10.0],
[125.0, -13.0],
[120.0, -13.0]
]],
[[
[44.0, -64.0],
[44.0, -61.0],
[48.0, -61.0],
[48.0, -64.0],
[44.0, -64.0]
]]
]
}
}
}
}, {
name: 1,
location: 1
}).limit(2)
Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden, sind:
[
{
"_id": "6d70de9c-7b83-426d-81aa-f2173f97b64d",
"name": "Fabrikam, Inc. | Footwear Haven - Port Erling",
"location": { "lat": 45.641, "lon": -118.4963 }
},
{
"_id": "96d48224-ce10-4a61-999a-8536d442f81a",
"name": "Wide World Importers | Eyewear Bazaar - West Oletachester",
"location": { "lat": 47.3461, "lon": -61.6605 }
}
]