Индекс Mongodb 2dsphere для поля вложенного массива

Я создал коллекцию, и объект выглядит так.

[_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}) 

Надеюсь, поможет!