Udostępnij za pośrednictwem


Obsługa zapytań geoprzestrzennych

DOTYCZY: MongoDB vCore

Dane geoprzestrzenne można teraz przechowywać i wykonywać zapytania przy użyciu opartej na rdzeniach wirtualnych usługi Azure Cosmos DB dla bazy danych MongoDB. To ulepszenie zapewnia zaawansowane narzędzia do zarządzania danymi przestrzennymi i analizowania ich, umożliwiając szeroką gamę aplikacji, takich jak śledzenie lokalizacji w czasie rzeczywistym, optymalizacja tras i analiza przestrzenna.

Oto krótkie omówienie poleceń geoprzestrzennych i operatorów obsługiwanych teraz:

Operatory zapytań geoprzestrzennych

$geoIntersects

Wybiera dokumenty, w których określona geometria przecina geometrię dokumentów. Przydatne do znajdowania dokumentów, które współdzielą jakąkolwiek część przestrzeni z daną geometrią.

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

$geoWithin

Wybiera dokumenty z danymi geoprzestrzennymi, które istnieją całkowicie w określonym kształcie. Ten operator służy do znajdowania dokumentów w zdefiniowanym obszarze.

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

$box

Definiuje prostokątny obszar przy użyciu dwóch par współrzędnych (w lewym dolnym i prawym górnym rogu). Używany z operatorem $geoWithin do znajdowania dokumentów w tym prostokącie. Na przykład znalezienie wszystkich lokalizacji w regionie prostokątnym na mapie.

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

$center

Definiuje okrągły obszar przy użyciu punktu środkowego i promienia w radianach. Używany z operatorem $geoWithin aby znaleźć dokumenty w tym okręgu.

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

$centerSphere

Podobnie jak $center, ale definiuje obszar kulisty przy użyciu punktu środkowego i promienia w radianach. Przydatne w obliczeniach geometrii sfericznej.

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

$geometry

Określa obiekt GeoJSON w celu zdefiniowania geometrii. Używany z operatorami geoprzestrzennymi do wykonywania zapytań na podstawie złożonych kształtów.

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

$maxDistance

Określa maksymalną odległość od punktu zapytania geoprzestrzennego. Używane z operatorami $near i $nearSphere. Na przykład znalezienie wszystkich lokalizacji w ciągu 2 km od danego punktu.

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

$minDistance

Określa minimalną odległość od punktu zapytania geoprzestrzennego. Używane z operatorami $near i $nearSphere.

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

$polygon

Definiuje wielokąt przy użyciu tablicy par współrzędnych. Używany z operatorem $geoWithin do znajdowania dokumentów w tym wielokącie.

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

$near

Znajduje dokumenty, które znajdują się w pobliżu określonego punktu. Zwraca dokumenty posortowane według odległości od punktu. Na przykład znalezienie najbliższych restauracji w lokalizacji użytkownika.

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

$nearSphere

Podobnie jak $near, ale wykonuje obliczenia na powierzchni kulistej. Przydatne do dokładniejszego obliczania odległości na powierzchni Ziemi.

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

Etap agregacji geoprzestrzennych

$geoNear

Wykonuje zapytanie geoprzestrzenne w celu zwrócenia dokumentów posortowanych według odległości od określonego punktu. Może zawierać dodatkowe kryteria zapytania i informacje o odległości zwracanej.

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

Zagadnienia i nieobsługiwane możliwości

  • Obecnie wykonywanie zapytań za pomocą wielokąta GeoJSON z pojedynczym pierścieniem, którego obszar przekracza jedną półkulę, nie jest obsługiwany. W takich przypadkach rdzeń wirtualny Mongo zwraca następujący komunikat o błędzie:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Indeks złożony używający zwykłego indeksu i indeksu geoprzestrzennego nie jest dozwolony. Na przykład:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Wielokąty z otworami nie są obecnie obsługiwane do użytku z zapytaniami $geoWithin. Mimo że wstawianie wielokąta z otworami nie jest ograniczone, ostatecznie kończy się niepowodzeniem z następującym komunikatem o błędzie:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Pole klucza jest zawsze niezbędne na etapie przetwarzania danych przez agregację $geoNear. Jeśli brakuje pola klucza, wystąpi następujący błąd:

    Error: $geoNear requires a 'key' option as a String
    
  • Etapy $geoNear, $neari $nearSphere nie mają rygorystycznych wymagań dotyczących indeksu, więc te zapytania nie kończą się niepowodzeniem, jeśli brakuje indeksu.