Я создал коллекцию, и объект выглядит так.
[_id] => MongoId Object ( [$id] => 53087f483b15eaeb6c3c9869 ) [time_from] => 2014-02-22 00:00:00 [time_to] => 2014-02-22 00:10:00 [checkin] => Array ( [0] => Array ( [time_frame] => 2014-02-22 00:00:56 [user_id] => 1 [loc] => Array ( [type] => Point [coordinates] => Array ( [0] => 73.43 [1] => 42.22 ) ) ) [1] => Array ( [time_frame] => 2014-02-22 00:00:56 [user_id] => 2 [loc] => Array ( [type] => Point [coordinates] => Array ( [0] => 73.10 [1] => 42.97 ) ) ) }
Мне нужно создать индекс «2dsphere» для поля «loc». Поле checkin имеет все координаты местоположения, хранящиеся в формате массива.
Я попытался создать индекс, как показано ниже.
db.<collection>.ensureIndex( { "checkin.loc" : "2dsphere" } );
и я получил это ниже сообщения об ошибке.
"err" : "Can't extract geo keys from object, malformed geometry?:{ type: \"Point\", coordinates: [ \"73.10\", \"40.73\" ] }"
Что мне не хватает? Любая помощь будет оценена! Заранее спасибо.
Документ, который вы мне предоставили, выглядит хорошо для меня, я также провел простой тест с короткой версией вашего документа, и он работает для меня.
"_id" : ObjectId("530cb07c009d8c323b477957"), "time_from" : ISODate("2014-02-25T15:02:20.714Z"), "checkin" : [ { "user_id" : 1, "loc" : { "type" : "Point", "coordinates" : [ 73.43, 42.22 ] } } ] db.testGeo.ensureIndex( { "checkin.loc" : "2dsphere" } );
Поэтому я предлагаю проверить другие документы в коллекции, некоторые из них могут быть искажены для индекса. Также убедитесь, что ваши элементы массива координат не являются строками. Поскольку этот документ недействителен для индекса 2dsphere:
"_id" : ObjectId("530cb07c009d8c323b477957"), "time_from" : ISODate("2014-02-25T15:02:20.714Z"), "checkin" : [ { "user_id" : 1, "loc" : { "type" : "Point", "coordinates" : [ "73.43", "42.22" ] } } ]
Обратите внимание на кавычки для элементов координат, которые делают их строками.
ОТВЕТ НА КОММЕНТАРИЙ: Mongo допускает только один геопространственный индекс на коллекцию. Поэтому вам не нужно указывать весь путь поля для вашей runCommand. Название коллекции достаточно. Это должно работать для вас, если имя коллекции – checkin_20140222
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
Надеюсь, поможет!