MongoDB: массив геопространственных индексов не в правильном формате - PullRequest
3 голосов
/ 04 января 2012

При попытке настроить использование геопространственного индекса в MongoDB, я сталкиваюсь с сообщением об ошибке, что массив местоположений не в правильном формате.

Это мой тестовый набор.

{
    "_id" : ObjectId("4f037ac176d6fdab5b00000a"),
    "CorporateId" : "XYZ12345",
    "Places" : [
           {

                   "Location" : {
                           "Longitude" : "50.0",
                           "Latitude" : "50.0"
                   },
                   "ValidFrom" : "2011-11-01 00:00:00",
                   "ValidTo" : "2021-12-31 00:00:00",
                   "itemCount" : "1"
           }
    ]
}

После запуска этого кода.

db.test.ensureIndex({"Places.Location": "2d"});

Я получаю это сообщение об ошибке

объект местоположения ожидается, массив местоположений не в правильном формате

Я предполагаю, что Long / Latдолжен быть числом.В настоящее время это объект.

typeof db.test.Places.Location.Longitude -> Object
typeof db.test.Places.Location -> Object

Моя проблема в том, что, поскольку я все еще плохо знаком с MongoDB, я не знаю, как лучше всего подойти к этой проблеме.

Ответы [ 2 ]

10 голосов
/ 04 января 2012

Mongodb ожидает числа для координат, пока вы передаете в строке.

"Location" : {
                       "Longitude" : 50.0, // <<<<<<<<<<<<<< use numbers instead
                       "Latitude" : 50.0
               },

Подробнее см. http://www.mongodb.org/display/DOCS/Geospatial+Indexing.

0 голосов
/ 05 января 2012

Проблема была исправлена ​​путем преобразования параметров Location в тип с плавающей точкой, как этот.

$var = $JSonString['Places'];
 $test=count($var);

 $i=0;
 for ( $i=0; $i<$test;$i++){
       $lon = (float)$JSonString['Places'][$i]['Location']['Longitude'];
       $lat = (float)$JSonString['Places'][$i]['Location']['Latitude'];
       $JSonString['Places'][$i]['Location']['Longitude'] =$lon ;
       $JSonString['Places'][$i]['Location']['Latitude'] =$lat ;
       //error_log($lon . "->".gettype($JSonString['Places'][$i]['Location']['Latitude']), 3 , "/var/tmp/my-errors.log");
 }
...