Wydaje się, że ma to związek z zamówieniem. Jeśli używasz $geoWithin
i próbujesz znaleźć punkty wewnątrz wielokąta, rzecz, która jest w środku, to pole, którego szukasz. Jednak $geoIntersects
działa w obu kierunkach, więc możesz wyszukiwać punkty wewnątrz wielokątów lub wielokątów zawierających punkty, np.:
db.geom.insert({
"polygons": {
"type":"Polygon",
"coordinates": [[
[ 17.60083012593064, 78.18557739257812],
[ 17.16834652544664, 78.19381713867188],
[ 17.17490690610013, 78.739013671875],
[ 17.613919673106714, 78.73489379882812],
[ 17.60083012593064, 78.18557739257812]
]]
}
});
db.geom.find({
polygons: {
$geoIntersects: {
$geometry: {
"type": "Point",
"coordinates": [17.3734, 78.4738]
}
}
}
});
Zauważ też, że musisz powtórzyć pierwszy punkt wielokąta na końcu. Jeśli usuniesz ostatnią parę, otrzymasz $err
:
Nie można kanonizować zapytania:błąd „BadValue bad geo query”.
Wygląda na to, że MongoDB pozwala wstawiać nieprawidłowe geometrie i narzeka tylko wtedy, gdy próbujesz dodać indeks 2dsphere lub wykonujesz zapytanie przecięcia/w/w pobliżu, co, jak sądzę, jest rozsądne, ponieważ GeoJSON może być prawidłowym JSON, nie będąc prawidłową geometrią.