Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De $geometry operator geeft een GeoJSON-geometrieobject op voor georuimtelijke query's. Het wordt gebruikt in andere georuimtelijke operators om shapes en punten voor ruimtelijke berekeningen te definiëren.
Syntaxis
{
$geometry: {
type: <GeoJSON type>,
coordinates: <coordinates>
}
}
Parameterwaarden
| Kenmerk | Description |
|---|---|
type |
GeoJSON-objecttype (punt, veelhoek, multipolygon, enzovoort) |
coordinates |
Coördinaten die het GeoJSON-object definiëren als een matrix |
Voorbeelden
Laten we het gebruik begrijpen met voorbeeld-json uit stores de gegevensset.
{
"_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
}
]
}
]
}
Voorbeeld 1: Dichtstbijzijnde winkels zoeken naar puntgeometrie
Voor betere prestaties begint u met het maken van de vereiste 2dsphere index.
db.stores.createIndex({ location: "2dsphere" })
De query haalt maximaal twee winkels op die het dichtst bij het punt bij coördinaten liggen [46.2917, -62.6354], gesorteerd op nabijheid. Hierbij wordt de operator $near gebruikt om resultaten te sorteren op afstand van een specifiek punt, zodat winkels kunnen worden gevonden die geografisch het dichtst bij een bepaalde locatie liggen.
db.stores.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [46.2917, -62.6354]
}
}
}
}, {
name: 1,
location: 1
}).limit(2)
De eerste twee resultaten die door deze query worden geretourneerd, zijn:
[
{
"_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 }
}
]
Voorbeeld 2: Dichtstbijzijnde winkels zoeken naar polygoongeometrie
Met deze query worden maximaal twee winkels gevonden waarvan de locaties elkaar kruisen met een gedefinieerd rechthoekige veelhoek die is gebonden door coördinaten van [-80.0, -75.0] tot [-55.0, -70.0].
De $geoIntersects operator vindt winkels die overlappen met of raken uw veelhoekgrenzen, perfect voor het identificeren van welke locaties interactie hebben met een specifieke geografische zone, ongeacht of ze zich volledig in de zone bevinden of alleen de rand overschrijden.
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)
De eerste twee resultaten die door deze query worden geretourneerd.
[
{
"_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"
}
]
Voorbeeld 3: Dichtstbijzijnde winkels zoeken naar geometrie met meerdere veelhoeken
In het voorbeeld worden maximaal twee winkels opgehaald waarvan de locaties binnen een van de twee gedefinieerde rechthoekige regio's (MultiPolygon) vallen: één in de buurt van de coördinaten [120.0, -13.0] tot [125.0, -10.0] en een andere in de buurt van [44.0, -64.0] tot [48.0, -61.0].
Het gebruikt de operator $geoWithin met een multipolygongeometrie om te zoeken naar winkels die zijn ingesloten door een van de opgegeven veelhoeken, waardoor het handig is om tegelijkertijd query's uit te voeren op meerdere niet-aangrenzende geografische gebieden.
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)
De eerste twee resultaten die door deze query worden geretourneerd, zijn:
[
{
"_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 }
}
]