Läs på engelska

Dela via


Stöd för geospatiala frågor

GÄLLER FÖR: MongoDB vCore

Geospatiala data kan nu lagras och frågas med hjälp av vCore-baserade Azure Cosmos DB för MongoDB. Den här förbättringen innehåller kraftfulla verktyg för att hantera och analysera rumsliga data, vilket möjliggör en mängd olika program, till exempel platsspårning i realtid, routningsoptimering och rumslig analys.

Här är en snabb översikt över de geospatiala kommandon och operatorer som nu stöds:

Geospatiala frågeoperatorer

$geoIntersects

Markerar dokument där en angiven geometri korsar dokumentens geometri. Användbart för att hitta dokument som delar en del av utrymmet med en viss geometri.

   db.collection.find({
       location: {
           $geoIntersects: {
               $geometry: {
                   type: "<GeoJSON object type>",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$geoWithin

Markerar dokument med geospatiala data som finns helt inom en angiven form. Den här operatorn används för att hitta dokument inom ett definierat område.

   db.collection.find({
       location: {
           $geoWithin: {
               $geometry: {
                   type: "Polygon",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$box

Definierar ett rektangulärt område med två koordinatpar (nedre vänstra och övre högra hörn). Används med operatorn $geoWithin för att hitta dokument i den här rektangeln. Du kan till exempel hitta alla platser i en rektangulär region på en karta.

  db.collection.find({
      location: {
          $geoWithin: {
              $box: [[lowerLeftLong, lowerLeftLat], [upperRightLong, upperRightLat]]
          }
      }
  })

$center

Definierar ett cirkulärt område med hjälp av en mittpunkt och en radie i radianer. Används med operatorn $geoWithin för att hitta dokument i den här cirkeln.

  db.collection.find({
      location: {
          $geoWithin: {
              $center: [[longitude, latitude], radius]
          }
      }
  })

$centerSphere

$centerLiknar , men definierar ett sfäriskt område med hjälp av en mittpunkt och en radie i radianer. Användbart för sfäriska geometriberäkningar.

  db.collection.find({
      location: {
          $geoWithin: {
              $centerSphere: [[longitude, latitude], radius]
          }
      }
  })

$geometry

Anger ett GeoJSON-objekt för att definiera en geometri. Används med geospatiala operatorer för att utföra frågor baserat på komplexa former.

  db.collection.find({
      location: {
          $geoIntersects: {
              $geometry: {
                  type: "<GeoJSON object type>",
                  coordinates: [longitude, latitude]
              }
          }
      }
  })

$maxDistance

Anger det maximala avståndet från en punkt för en geospatial fråga. Används med $near och $nearSphere operatorer. Du kan till exempel hitta alla platser inom 2 km från en viss punkt.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $maxDistance: distance
          }
      }
  })

$minDistance

Anger det minsta avståndet från en punkt för en geospatial fråga. Används med $near och $nearSphere operatörer.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $minDistance: distance
          }
      }
  })

$polygon

Definierar en polygon med hjälp av en matris med koordinatpar. Används med operatorn $geoWithin för att hitta dokument i den här polygonen.

  db.collection.find({
      location: {
          $geoWithin: {
              $geometry: {
                  type: "Polygon",
                  coordinates: [[[...], [...], [...], [...]]]
              }
          }
      }
  })

$near

Söker efter dokument som ligger nära en angiven punkt. Returnerar dokument sorterade efter avstånd från punkten. Du kan till exempel hitta närmaste restauranger till en användares plats.

    db.collection.find({
        location: {
            $near: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

$nearSphere

$nearLiknar , men utför beräkningar på en sfärisk yta. Användbart för mer exakta avståndsberäkningar på jordens yta.

    db.collection.find({
        location: {
            $nearSphere: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

Geospatialt aggregeringssteg

$geoNear

Utför en geospatial fråga för att returnera dokument sorterade efter avstånd från en angiven punkt. Kan innehålla ytterligare frågevillkor och returavståndsinformation.

  db.collection.aggregate([
      {
          $geoNear: {
              near: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              distanceField: "distance",
              spherical: true
          }
      }
  ])

Överväganden och funktioner som inte stöds

  • För närvarande stöds inte frågor med en geoJSON-polygon med en enda ring, vars område överskrider en enda halvklot. I sådana fall returnerar Mongo vCore följande felmeddelande:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Ett sammansatt index med ett vanligt index och geospatialt index tillåts inte. Till exempel:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Polygoner med hål stöds för närvarande inte för användning med $geoWithin frågor. Även om infogning av en polygon med hål inte är begränsad misslyckas den till slut med följande felmeddelande:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Nyckelfältet krävs alltid i $geoNear aggregeringssteget. Om nyckelfältet saknas uppstår följande fel:

    Error: $geoNear requires a 'key' option as a String
    
  • Faserna $geoNear, $nearoch $nearSphere har inte strikta indexkrav, så dessa frågor misslyckas inte om ett index saknas.