MongoDB: невозможно выполнить канонизацию запроса: плохой гео-запрос BadValue

Я проиндексировал поле loc на 2dsphere, и я не могу запустить запрос geowithin для данных типа GeoJson типа Point.

Вот запрос:

 db.test.find( { loc :
                     { $geoWithin :
                        { $geometry :
                           { type : "Polygon" ,
                             coordinates : [ [ [-74.6862705412253, 40.42341005] , 
                                               [-75.0846179, 39.9009465 ], 
                                               [-74.20570119999999, 41.0167639 ]
                                             ]
                                           ]
                           } 
                         } 
                      } 
                 } 

Выход:

  uncaught exception: error: {
"$err" : "Can't canonicalize query: BadValue bad geo query",
"code" : 17287
}

Структура документа:

         {
           "_id" : ObjectId("53d15e7132e7b7978c472e6e"),
           "loc" : {
                  "type" : "Point",
                   "coordinates" : [ -74.6862705412253, 40.42341005 ]
                   },

         }

Индексы:

{
"0" : {
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "name" : "_id_",
    "ns" : "collab.test"
},
"1" : {
    "v" : 1,
    "key" : {
        "loc" : "2dsphere"
    },
    "name" : "TestLocationIndex",
    "ns" : "collab.test",
    "2dsphereIndexVersion" : 2
}

}

Но, $Многоугольник отлично работает в тех же документах. Я пытаюсь понять, почему гейвитин не работает?

6
задан Swakesh 17 сент. '14 в 17:31
источник поделиться

1 ответ

Это потому, что ваш многоугольник не закрыт, вам действительно нужно минимум четыре точки для действительного многоугольника, с первой точкой, повторенной в конце, см. Документы GeoJSON Polygon. Сообщение об ошибке может быть немного более полезным, это нужно сказать. Это справедливо и для форматов Знаменитый текст (WKT) и хорошо известных двоичных (WKB) форматов, поэтому это не является особенностью GeoJSON.

Ваш запрос должен работать следующим образом:

db.test.find({loc :
                {$geoWithin :
                    {$geometry :
                       {type : "Polygon" ,
                           coordinates : [[[-74.6862705412253, 40.42341005] , 
                                           [-75.0846179, 39.9009465], 
                                           [-74.20570119999999, 41.0167639],
                                           [-74.6862705412253, 40.42341005]]]                                     
                        } 
                    } 
                 } 
             } 
13
ответ дан John Powell aka Barça 17 сент. '14 в 23:42
источник поделиться

Другие вопросы по меткам